2013-04-10 16 views
16

Bir projenin sınıf yapısına ağaç görünümü yüklemek için yansıma kullanıyorum. Bir sınıftaki üyelerin her biri kendilerine atanan özel bir özelliğe sahiptir.Yansıma ile bir MemberInfo türünü alma

MemberInfo.GetCustomAttributes() kullanarak bir sınıf için öznitelikleri alma konusunda bir sorunum yok, ancak bir sınıf üyesi özel bir sınıfsa ve daha sonra özel öznitelikleri döndürmek için kendini ayrıştırma gerekiyorsa bir çalışma yöntemine ihtiyacım var.

Şimdiye kadar, benim kodudur: Bir MemberInfo örneğinin hedef tür yüzden uygun şekilde işleyebilir almanın kolay yolu

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. 
    } 
} 

var mı? Bariz bir şeyi kaçırdığımı hissediyorum, ancak dakikalar içinde daireler çiziyorum.

cevap

8

GetProperties, PropertyInfo dizisini döndürür; bu nedenle bunu kullanmalısınız.
O zaman sadece PropertyType özelliğini kullanma meselesi.

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

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

Evet, 'MemberInfo [] membersInfo =' bozuk bir işarettir. 'Var' gibi nedenlerimden biri - yanlış olan daha az şey. –

+1

Fantastik, teşekkürler Daniel. – GrandMasterFlush

37

Sana bu uzantı yöntemine taşımak eğer daha iyi performans elde edebilirsiniz düşünüyorum:

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" 
      ); 
    } 
} 

, herhangi MemberInfo için değil sadece PropertyInfo çalışabilir. Bu listeden MethodInfo'dan kaçınabilirsiniz çünkü kendi başına yatan türden değil (dönüş tipi). Senin durumunda

:

bu varsayılan olarak BCL bir parçası olmamıştır Acaba neden
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

Bunu beğendim! Her zaman bir 'PropertyInfo' olduğunu bildiğimde bile biraz balık dökümü hissettim. –

İlgili konular