1

インターフェイスに多数のプロパティがある場合、この例では、達成しようとしていることを示すため、1 つだけを使用します。

  interface IFoo
  {
    [Bar()]
    string A { get; set; }
  }
 class Base { }
 class Foo : Base, IFoo
 {
   public string A { get; set; }
 }

だから私はこれを行うとき:

Foo f = new Foo();
f.A = "Value";
Attribute b = Attribute.GetCustomAttribute(f.GetType().GetProperty("A"), typeof(Bar));

Bar属性のインスタンスを取得できると期待していました。これのほとんどは汎用クラスで行われており、検証モデルに属性を使用しているため、インターフェイスに暗黙的にキャストできず、インターフェイスのプロパティの属性を取得できません。インターフェイスがどのタイプになるかがわからないためです。またはどのタイプがそれを実装しますか。たとえば、インスタンスから属性を取得する方法が必要ですBase

public void GenericMethod<T>(T instance) where T : Base
{
    //Get my instance of Bar here.
}

私がやろうとしていることは明らかです。よろしくお願いします。

4

2 に答える 2

1

Barこれにより、次のタイプのすべてのプロパティに適用されるすべてのカスタム属性のリストが得られますinstance

var attibutes = instance.GetType().GetInterfaces()
                    .SelectMany(i => i.GetProperties())
                    .SelectMany(
                        propertyInfo =>
                        propertyInfo.GetCustomAttributes(typeof (BarAttribute), false)
                    );

それはあなたが探しているものですか?

于 2012-10-31T10:03:59.950 に答える
0

プロパティには属性Foo.A がありません。属性のみIFoo.Aがあります。次を使用する必要があります。

Attribute b = Attribute.GetCustomAttribute(typeof(IFoo).GetProperty("A"), ...);

他にできることは、を介してインターフェイステーブルを明示的にチェックすることですf.GetType().GetInterfaceMap(typeof(IFoo))。おそらくf.GetType().GetInterfaces()、「A」が含まれている各インターフェイスをチェックします。

のようなもの(そしてこれは厄介です):

var outerProp = f.GetType().GetProperty("A");
Attribute b = Attribute.GetCustomAttribute(outerProp, typeof(BarAttribute));
if (b == null)
{
    var candidates = (from iType in f.GetType().GetInterfaces()
                      let prop = iType.GetProperty("A")
                      where prop != null
                      let map = f.GetType().GetInterfaceMap(iType)
                      let index = Array.IndexOf(map.TargetMethods, outerProp.GetGetMethod())
                      where index >= 0 && map.InterfaceMethods[index] == prop.GetGetMethod()
                      select prop).Distinct().ToArray();
    if (candidates.Length == 1)
    {
        b = Attribute.GetCustomAttribute(candidates[0], typeof(BarAttribute));
    }
}

これは何をしますか:

  • 元のプロパティに属性がなかった場合...
  • タイプが実装するインターフェースをチェックします...
  • そして、クラスプロパティが実装するインターフェイスプロパティを確認します。
  • 正確に1つあるかどうかを確認します...
  • その属性を探します
于 2012-10-31T10:05:30.063 に答える