2013-04-10 19 views
16

リフレクションを使用してプロジェクトのクラス構造でツリービューを読み込みます。クラス内の各メンバーには、カスタム属性が割り当てられています。リフレクションを使用したMemberInfoのタイプの取得

MemberInfo.GetCustomAttributes()を使用してクラスの属性を取得する際に問題はありませんが、クラスメンバーがカスタムクラスであり、カスタム属性を返すためには解析する必要があります。

はこれまでのところ、私のコードは次のとおりです。

​​

は、私は適切に処理することができますので、のMemberInfoインスタンスのターゲットタイプを取得する簡単な方法はありますか?私は何か明白なものを見逃していると感じますが、私は分に円で回っています。

答えて

8

GetPropertiesPropertyInfoの配列を返しますので、それを使用する必要があります。
次に、PropertyTypeプロパティを使用するだけです。

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

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

ええ、 'MemberInfo [] membersInfo ='は悪い兆候です。私が 'var'を好む理由の1つ - 間違ったことが少ないこと。 –

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

これはデフォルトでBCLの一部となっていなかった私はなぜだろうか。

+1

私はこれが好きです!私はそれが「PropertyInfo」であることが分かっていたとしても、常にちょっとした釣り銭を感じました。 –

関連する問題