2013-04-10 16 views
16

के साथ सदस्यइन्फो का प्रकार प्राप्त करना मैं एक परियोजना की कक्षा संरचना के साथ एक वृक्षदृश्य लोड करने के लिए प्रतिबिंब का उपयोग कर रहा हूं। कक्षा में प्रत्येक सदस्यों के पास एक कस्टम विशेषता है जो उन्हें सौंपा गया है।प्रतिबिंब

मुझे MemberInfo.GetCustomAttributes() का उपयोग कर कक्षा के लिए गुण प्राप्त करने में कोई समस्या नहीं है, हालांकि मुझे क्लास सदस्य एक कस्टम क्लास है और फिर कस्टम विशेषताओं को वापस करने के लिए खुद को पार्स करने की आवश्यकता है, तो मुझे काम करने का एक तरीका चाहिए।

अब तक, मेरे कोड है:

MemberInfo[] membersInfo = typeof(Project).GetProperties(); 

foreach (MemberInfo memberInfo in membersInfo) 
{ 
    foreach (object attribute in memberInfo.GetCustomAttributes(true)) 
    { 
     // Get the custom attribute of the class and store on the treeview 
     if (attribute is ReportAttribute) 
     { 
      if (((ReportAttribute)attribute).FriendlyName.Length > 0) 
      { 
       treeItem.Items.Add(new TreeViewItem() { Header = ((ReportAttribute)attribute).FriendlyName }); 
      } 
     } 
     // PROBLEM HERE : I need to work out if the object is a specific type 
     //    and then use reflection to get the structure and attributes. 
    } 
} 

वहाँ एक MemberInfo उदाहरण का लक्ष्य प्रकार तो मैं यह उचित रूप से संभाल कर सकते हैं होने का एक आसान तरीका है? मुझे लगता है कि मुझे कुछ स्पष्ट याद आ रहा है लेकिन मैं मिनट में सर्किल में घूम रहा हूं।

उत्तर

8

GetPropertiesPropertyInfo की एक सरणी देता है ताकि आपको इसका उपयोग करना चाहिए।
फिर यह PropertyType संपत्ति का उपयोग करने का विषय है।

PropertyInfo[] propertyInfos = typeof(Project).GetProperties(); 

foreach (PropertyInfo propertyInfo in propertyInfos) 
{ 
    // ... 
    if(propertyInfo.PropertyType == typeof(MyCustomClass)) 
     // ... 
} 
+4

हाँ, 'सदस्यInfo [] membersInfo =' एक बुरा संकेत है। कारणों में से एक 'var' - कम चीजें गलत होने के लिए। –

+1

शानदार, धन्यवाद डैनियल। – GrandMasterFlush

37

मुझे लगता है कि आप बेहतर प्रदर्शन प्राप्त कर सकते हैं यदि आप इस विस्तार विधि चारों ओर ले जाने के लिए:

public static Type GetUnderlyingType(this MemberInfo member) 
{ 
    switch (member.MemberType) 
    { 
     case MemberTypes.Event: 
      return ((EventInfo)member).EventHandlerType; 
     case MemberTypes.Field: 
      return ((FieldInfo)member).FieldType; 
     case MemberTypes.Method: 
      return ((MethodInfo)member).ReturnType; 
     case MemberTypes.Property: 
      return ((PropertyInfo)member).PropertyType; 
     default: 
      throw new ArgumentException 
      (
      "Input MemberInfo must be if type EventInfo, FieldInfo, MethodInfo, or PropertyInfo" 
      ); 
    } 
} 

, किसी भी MemberInfo के लिए काम करना चाहिए बस PropertyInfo नहीं। आप उस सूची से MethodInfo से बच सकते हैं क्योंकि यह झूठ बोलने वाले प्रकार के नीचे नहीं है (लेकिन वापसी प्रकार)।

आपके मामले में:

foreach (MemberInfo memberInfo in membersInfo) 
{ 
    foreach (object attribute in memberInfo.GetCustomAttributes(true)) 
    { 
     if (attribute is ReportAttribute) 
     { 
      if (((ReportAttribute)attribute).FriendlyName.Length > 0) 
      { 
       treeItem.Items.Add(new TreeViewItem() { Header = ((ReportAttribute)attribute).FriendlyName }); 
      } 
     } 

     //if memberInfo.GetUnderlyingType() == specificType ? proceed... 
    } 
} 

मुझे आश्चर्य है कि क्यों यह डिफ़ॉल्ट रूप से बीसीएल का हिस्सा नहीं किया गया है।

+1

मुझे यह पसंद है! हमेशा मुझे थोड़ा फिश कास्टिंग महसूस हुआ, भले ही मुझे पता था कि यह 'PropertyInfo' था। –