2008-10-26 13 views
26

मुझे MemberInfo ऑब्जेक्ट का मूल्य कैसे प्राप्त होगा? .Name चर का नाम देता है, लेकिन मुझे मूल्य की आवश्यकता है।मुझे सदस्यइंफो का मूल्य कैसे प्राप्त होगा?

मुझे लगता है कि आप इसे FieldInfo के साथ कर सकते हैं लेकिन मेरे पास स्निपेट नहीं है, अगर आपको पता है कि यह कैसे करना है तो आप एक स्निपेट प्रदान कर सकते हैं ??

धन्यवाद!

उत्तर

32

यहाँ क्षेत्रों के लिए एक उदाहरण है, FieldInfo.GetValue का उपयोग कर:

using System; 
using System.Reflection; 

public class Test 
{ 
    // public just for the sake of a short example. 
    public int x; 

    static void Main() 
    { 
     FieldInfo field = typeof(Test).GetField("x"); 
     Test t = new Test(); 
     t.x = 10; 

     Console.WriteLine(field.GetValue(t)); 
    } 
} 

इसी कोड PropertyInfo.GetValue() उपयोग करने वाली प्रॉपर्टी के लिए काम करेगा - हालांकि वहाँ आप भी गुण के लिए किसी भी पैरामीटर के लिए मान पारित करने के लिए की जरूरत है। ("सामान्य" सी # गुणों के लिए कोई भी नहीं होगा, लेकिन सी # इंडेक्सर्स ढांचे के संबंध में गुणों के रूप में भी गिनते हैं।) विधियों के लिए, यदि आप विधि को कॉल करना चाहते हैं और उपयोग करने के लिए आपको Invoke पर कॉल करना होगा प्रतिलाभ की मात्रा।

+2

धन्यवाद जॉन - आपको एक उदाहरण एक MemberInfo वस्तु हालांकि साथ शुरू दे सकता है? –

+1

किस तरह का? MemberInfos गुण, फ़ील्ड, विधियों, घटनाओं या अन्य प्रकार हो सकता है। आप उन्हें उसी तरह से इलाज नहीं कर सकते हैं। उदाहरण के लिए, नेस्टेड प्रकार का "मूल्य" क्या होगा? शायद आपको अपनी समस्या के बारे में हमें और बताना चाहिए। –

+1

बहुत खराब GetValue/SetValue एक इंटरफ़ेस नहीं था जिसे चेक किया जा सकता था। –

10

जॉन की जवाब आदर्श है - सिर्फ एक अवलोकन: सामान्य डिजाइन के हिस्से के रूप, मैं करूंगा:

  1. आम तौर पर गैर सरकारी सदस्यों के खिलाफ दर्शाती बचने
  2. बचने सार्वजनिक क्षेत्रों होने (लगभग हमेशा)

इन दोनों का नतीजा यह है कि सार्वजनिक संपत्तियों के खिलाफ प्रतिबिंबित करने के लिए आम तौर पर आप केवल जरूरत है (यदि आप नहीं करना चाहिए है कॉलिंग विधियों को तब तक कॉल करें जब तक कि आप नहीं जानते कि वे क्या करते हैं; संपत्ति गेटर्स होने की उम्मीद है [आलसी लोडिंग]]। तो PropertyInfo के लिए यह केवल prop.GetValue(obj, null); है।

वास्तव में, मैं System.ComponentModel के एक बड़े प्रशंसक हूँ, इसलिए मैं का उपयोग करने के लिए परीक्षा होगी:

foreach(PropertyDescriptor prop in TypeDescriptor.GetProperties(obj)) 
    { 
     Console.WriteLine("{0}={1}", prop.Name, prop.GetValue(obj)); 
    } 

या एक विशिष्ट संपत्ति के लिए:

PropertyDescriptor prop = TypeDescriptor.GetProperties(obj)["SomeProperty"]; 
    Console.WriteLine("{0}={1}", prop.Name, prop.GetValue(obj)); 

एक System.ComponentModel का लाभ यह है कि है अमूर्त डेटा मॉडल के साथ काम करेंगे, जैसे DataView वर्चुअल गुणों के रूप में कॉलम का खुलासा करता है; अन्य चाल भी हैं (जैसे performance tricks)।

+0

यह साबित कर दिया वस्तु पर गुण और GetField बुला() के साथ काम करने के लिए एक अशक्त लौटने रखा। इसके लिए धन्यवाद। – MikeMalter

+0

आह, वहाँ यह है .. मैं केवल थोड़ा याद कर सकते हैं कि एक और साधन प्रतिबिंब नाम स्थान के बाहर से ही अस्तित्व में: 'MemberInfo' और' PropertyInfo' .. 'PropertyDescriptor' मेरे वर्तमान उद्देश्य और साथ ही मैं' INotifyPropertyChanged' में उपयोग कर रहा हूँ में कार्य करता है मेरी उदाहरण ... –

12

हालांकि मैं आम तौर पर फ़ील्ड को प्रतिबिंबित करने के बारे में मार्क के बिंदु से सहमत नहीं हूं, कई बार इसकी आवश्यकता होती है। यदि आप किसी सदस्य को प्रतिबिंबित करना चाहते हैं और आपको कोई परवाह नहीं है कि यह एक फ़ील्ड या संपत्ति है, तो आप मूल्य प्राप्त करने के लिए इस एक्सटेंशन विधि का उपयोग कर सकते हैं (यदि आप मान के बजाय प्रकार चाहते हैं, तो this question पर नाराज का जवाब देखें):

public static object GetValue(this MemberInfo memberInfo, object forObject) 
    { 
     switch (memberInfo.MemberType) 
     { 
      case MemberTypes.Field: 
       return ((FieldInfo)memberInfo).GetValue(forObject); 
      case MemberTypes.Property: 
       return ((PropertyInfo)memberInfo).GetValue(forObject); 
      default: 
       throw new NotImplementedException(); 
     } 
    } 
संबंधित मुद्दे

 संबंधित मुद्दे