使用从接口继承 属性 的属性

Using attribute of inherited property from an interface

我一直在尝试使用已在接口中声明的 属性 的属性。

假设:

[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; }
}

现在,根据我的阅读,带有 inheritance=true 的 GetCustomAttribute() 应该 return 继承的属性,但它看起来不起作用。

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

为什么不起作用?我怎样才能得到属性?

Child 没有任何自定义属性,ITest 有自定义属性,因此您必须对 ITest.[=21= 的成员调用 GetCustomAttributes ]

继承和实现是有区别的。如果 Child 派生自具有 y 属性 并装饰有 My1Attribute.

的某个基 class,则继承会很好

在你的例子中,Child implements ITestITest 是不同的类型,在继承层次之外。

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

这只是一个草图,不是详细的答案。它应该让您了解如何找到该属性,从 Child.

开始

您可以使用 typeof(Child).GetInterfaces() 获取一个数组,从中您可以看到 Child 实现了 ITest。假设t就是你从数组中得到的typeof(ITest),那么:

typeof(Child).GetInterfaceMap(t)

会给你一个结构 ("map") 看看 属性 getter (get accessor) get_y 来自 Child (in .TargetMethods) 对应于接口 (.InterfaceMethods)。答案当然是另一个get_y。因此,您拥有的是 ITesty 属性 的 get 访问器的 MethodInfo。要查找 属性 本身,请参见例如this answer to Finding the hosting PropertyInfo from the MethodInfo of getter/setter。获得 属性 信息后,检查其自定义属性以查找 My1Attribute 及其值 x.