मैं चयन की तलाश में हूं जहां परिणाम अज्ञात है लेकिन गुण स्ट्रिंग की सूची से दिए गए हैं

उदाहरण

public class A{
     public string PropertyA {get; set;}
     public double PropertyB {get; set;}
     public double PropertyC {get; set;}
     public double PropertyD {get; set;}
}

var list = new List<A>{ ... };

var propertyNames = new List<string>{"PropertyA", "PropertyD"}

मैं एक चयनकर्ता बनाना चाहता हूं जो PropertyA और PropertyD के साथ एक अनाम बनाता है, इसलिए मुझे कुछ ऐसा मिल सकता है

var result = list.Select( selector(propertynames) ).ToList();

जहां फिर से परिणाम [0] परिणाम [0] जैसे गुणों के साथ गुमनाम है। संपत्ति ए और परिणाम [0]। संपत्ति डी

0
Ozzy 10 जुलाई 2020, 11:48

1 उत्तर

सबसे बढ़िया उत्तर

मैं वास्तव में, वास्तव में इस बारे में अलग तरीके से जाने का सुझाव दूंगा।
हालांकि, इस समस्या से निपटने का एक तरीका यहां दिया गया है - System.Dynamic.ExpandoObject का उपयोग करें:

var result = list
    .Select(i =>
    {
        var expando = new ExpandoObject();
        var expandoAsDict = (IDictionary<string, object>)expando;
        var targetProperties = i
            .GetType()
            .GetProperties()
            .Where(p => propertyNames.Contains(p.Name))
            .ToDictionary(p => p.Name, p => p.GetValue(i));
        foreach (var property in targetProperties)
        {
            expandoAsDict.Add(property);
        }
        return (dynamic)expando;
    })
    .ToList();

फिर आप अपने वर्णन के अनुसार आगे बढ़ सकते हैं, उदाहरण के लिए:

Console.WriteLine(result[0].PropertyA);

अपेक्षित मूल्य लिखता है।

बेशक आप अपने गतिशील प्रकार के लिए Intellisense समर्थन के बारे में भूल सकते हैं (यदि यह शुरू में स्पष्ट नहीं था)।
नोट: एक और तरीका System.Reflection.Emit का उपयोग करके रनटाइम पर अपना प्रकार बनाना होगा, लेकिन यह और भी अजीब होगा।

आपको कामयाबी मिले!

1
Marchyello 10 जुलाई 2020, 13:09