2013-04-10 3 views
16

리플렉션을 사용하여 프로젝트의 클래스 구조로 트리 뷰를로드하고 있습니다. 클래스의 각 멤버에는 사용자 지정 특성이 할당되어 있습니다.리플렉션을 사용하여 MemberInfo 형식 가져 오기

MemberInfo.GetCustomAttributes()을 사용하여 클래스의 특성을 가져 오는 데 문제가 없습니다. 그러나 클래스 멤버가 사용자 지정 클래스이고 사용자 지정 특성을 반환하기 위해 자체 구문 분석이 필요한 경우 해결 방법이 필요합니다.

지금까지, 내 ​​코드는 다음과 MemberInfo가 인스턴스의 대상 유형은 그래서 적절하게 처리 할 수있는지고의 쉬운 방법은

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

있습니까? 나는 명백한 것을 놓치고 있다고 느낀다. 그러나 나는 분에 동그라미로 갈 것이다.

답변

8

GetPropertiesPropertyInfo의 배열을 반환하므로이를 사용해야합니다.
그런 다음 PropertyType 속성을 사용하기 만하면됩니다.

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

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

예, 'MemberInfo [] 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을 피할 수 있습니다. 귀하의 경우에는

:

이 기본적으로 BCL의 일부가되지 않았습니다 이유가 궁금
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'라는 것을 알았을 때조차 약간의 비린내 주조를 느꼈습니다. –

관련 문제