2016-12-27 3 views
1

Я пытаюсь использовать атрибут свойства, объявленного в интерфейсе.Использование атрибута унаследованного свойства из интерфейса

Предположим:

[AttributeUsage(AttributeTargets.Property, Inherited=true)] 
class My1Attribute : Attribute 
{ 
    public int x { get; set; } 
} 

interface ITest 
{ 
    [My1] 
    int y { get; set; } 
} 

class Child : ITest 
{ 
    public Child() { } 

    public int y { get; set; } 
} 

Теперь от того, что я прочитал, GetCustomAttribute() с наследованием = True должен вернуть унаследованную атрибут, но выглядит он не работает.

Attribute my = typeof(Child).GetProperty("y").GetCustomAttribute(typeof(My1Attribute), true); // my == null 

Почему это не работает? и как я могу получить атрибут?

ответ

1

Child не имеет каких-либо пользовательских атрибутов, ITest имеет их, так что вам придется позвонить GetCustomAttributes на членов ITest.

Существует разница между наследованием и реализацией. Наследование было бы неплохо, если бы Child был получен из некоторого базового класса, который имел свойство y, украшенное My1Attribute.

В вашем случае, ChildреализуетITest и ITest другой тип, вне иерархии наследования.

void Main() 
{ 
    var my1Attribute = typeof(ITest).GetProperty("y").GetCustomAttribute(typeof(My1Attribute)) as My1Attribute; 
    Console.WriteLine(my1Attribute.x); // Outputs: 0 
} 

[AttributeUsage(AttributeTargets.Property, Inherited = true)] 
class My1Attribute : Attribute 
{ 
    public int x { get; set; } 
} 

interface ITest 
{ 
    [My1] 
    int y { get; set; } 
} 

class Child : ITest 
{ 
    public Child() { } 

    public int y { get; set; } 
} 
0

Это всего лишь эскиз, а не подробный ответ. Он должен дать представление о том, как вы можете найти атрибут, начиная с Child.

Вы можете использовать typeof(Child).GetInterfaces(), чтобы получить массив, из которого вы можете видеть, что Child реализует ITest. Пусть t это typeof(ITest) вы вышли из массива, а затем:

typeof(Child).GetInterfaceMap(t) 

даст вам структуру («карту»), чтобы увидеть, что свойство геттер (get сбруя) get_y из Child.TargetMethods) соответствует в интерфейсе (.InterfaceMethods). Ответ еще один get_y, конечно. Итак, у вас есть MethodInfoget аксессуар y в ITest. Чтобы найти это свойство, см., Например, this answer to Finding the hosting PropertyInfo from the MethodInfo of getter/setter. После того, как у вас есть информация о свойствах, проверьте его пользовательские атрибуты, чтобы найти My1Attribute и его значение x.

Смежные вопросы