4

私はこのようなクラスバーを持っています:

class Foo : IFoo {
  [Range(0,255)]
  public int? FooProp {get; set}
}

class Bar : IFoo
{
  private Foo foo = new Foo();
  public int? FooProp { get { return foo.FooProp; }
                       set { foo.FooProp= value; } } 
}

プロパティ Bar.FooProp のみを反映する属性 [Range(0,255)] を見つける必要があります。つまり、現在解析中のクラスではなく、クラスインスタンス (.. new Foo()) でプロップが装飾されています。Infact Bar.FooProp には属性がありません

編集

インターフェイスの定義で属性を移動したので、継承されたインターフェイスを解析してそれらを見つける必要があります。Bar クラスは IFoo を実装する必要があるため、これを行うことができます。この特定のケースでは、運が良かったのですが、インターフェイスがない場合は問題が残ります...次回のために注意します

foreach(PropertyInfo property in properties)
{
  IList<Type> interfaces = property.ReflectedType.GetInterfaces();
  IList<CustomAttributeData> attrList;
  foreach(Type anInterface in interfaces)
  {
    IList<PropertyInfo> props = anInterface.GetProperties();
    foreach(PropertyInfo prop in props)
    {
      if(prop.Name.Equals(property.Name))
      { 
        attrList = CustomAttributeData.GetCustomAttributes(prop);
        attributes = new StringBuilder();
        foreach(CustomAttributeData attrData in attrList)
        {
            attributes.AppendFormat(ATTR_FORMAT,
                                        GetCustomAttributeFromType(prop));
        }
      }
    }
  }
4

2 に答える 2

2

しばらく前に、インターフェイスのメソッドで宣言された属性があり、インターフェイスを実装する型のメソッドから属性を取得したいという同様の状況がありました。例えば:

interface I {
  [MyAttribute]
  void Method( );
}

class C : I {
  void Method( ) { }
}

以下のコードは、型によって実装されているすべてのインターフェイスをチェックし、指定されたインターフェイス メンバーがmethod( を使用してGetInterfaceMap) 実装しているのを確認し、それらのメンバーの属性を返すために使用されます。この直前に、属性がメソッド自体に存在するかどうかも確認します。

IEnumerable<MyAttribute> interfaceAttributes =
  from i in method.DeclaringType.GetInterfaces( )
  let map = method.DeclaringType.GetInterfaceMap( i )
  let index = GetMethodIndex( map.TargetMethods, method )
  where index >= 0
  let interfaceMethod = map.InterfaceMethods[index]
  from attribute in interfaceMethod.GetCustomAttributes<MyAttribute>( true )
  select attribute;

...

static int GetMethodIndex( MethodInfo[] targetMethods, MethodInfo method ) {
  return targetMethods.IndexOf( target =>
         target.Name == method.Name
      && target.DeclaringType == method.DeclaringType
      && target.ReturnType == method.ReturnType
      && target.GetParameters( ).SequenceEqual( method.GetParameters( ), PIC )
  );
}
于 2009-10-19T19:55:53.807 に答える
1

を見ると、 (任意の時点で)FooPropの存在を特定するものは何もありません。Fooおそらく、fooフィールドを識別する属性を追加し、それを ( 経由でFieldInfo.FieldType) 検討することはできますか?

于 2009-06-20T11:37:51.297 に答える