c# - How to create expression at run-time -


मेरे पास एक वर्ग में 4 गुण हैं:

  class MyClass {public int i {get सार्वजनिक वर्ग सी {get; set;} सार्वजनिक चार सी {get; set;}}  

और इस वर्ग की एक सूची:

<पूर्व> var lstSource = नई सूची & lt; MyClass & gt; {नई माइकलस {i = 1, d = 1.2, s = "s1", c = '1'}, नया MyClass {i = 2, d = 2.2, s = "s2", c = '2'}, नया मायक्लस {i = 3, d = 3.2, s = "s3", c = '3'}};

अब मैं अंत उपयोगकर्ता से इन गुणों में से कुछ का नाम प्राप्त करना चाहता हूं और उसे अज्ञात प्रकार की एक सूची की आवश्यकता होती है, जिसमें वांछित गुण होते हैं प्रयोक्ता हमें वांछित गुणों की सूची देता है जैसे स्ट्रिंग का संग्रह (वांछित गुणों का नाम) उदाहरण के लिए वांछित संपत्तियों की सूची मान लीजिए:

  var wantedProperties = नई सूची & lt; स्ट्रिंग & gt; {"है"};  
  • समस्या 1: केवल यह गुण कैसे lstSource से प्राप्त करें

  • समस्या 2 : अनाम सूची में हर वैल्यू के रूप में हर संपत्ति का प्रकार कैसे प्रदान करें? "वांछितप्रोपेर्टीटीज" में प्रत्येक वस्तु के लिए यह सबसे ज्यादा एक अन्य वैरिएबल जोड़ता है जिसके परिणामस्वरूप सूची में टोपी दिखती संपत्ति का प्रकार दिखाता है इस उदाहरण के परिणामस्वरूप सूची सबसे अधिक हो सकती है:

      {{WantedProperty1_Value = 1, WantedProperty1_Type = typeof (int)}, {WantedProperty2_Value = 2, WantedProperty2_Type = typeof (string)}}  

सबसे पहले, आपका MyClass खेतों हैं, गुण नहीं आपको उन लोगों को पब्लिक इंट मैं (प्राप्त करें) में बदलना होगा; उदाहरण के लिए सेट करें।}

अब, आप मूल्य और टाइप प्राप्त करने के लिए प्रतिबिंब का उपयोग करके इसकी पहचान कर सकते हैं नाम।

  foreach (MystClust obj in lstSource) {foreach (wantedProperties में string propertyName) {PropertyInfo property = typeof (MyClass) .GetProperty (propertyName); ऑब्जेक्ट वैल्यू = प्रॉपर्टी.गेट वैल्यू (ओबीजे); प्रॉपर्टी टाइप टाइप करें property.PropertyType; }}  

यदि संपत्ति सार्वजनिक नहीं है, तो आपको एक का उपयोग करना होगा और BindingFlags.NonPublic का उपयोग करना होगा। BindingFlags.Instance बाध्यकारी झंडे।

अब आपको जो करना है उसे परिणाम सेट बना दिया गया है।


Comments