使用从接口继承 属性 的属性
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 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; }
}
这只是一个草图,不是详细的答案。它应该让您了解如何找到该属性,从 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
。因此,您拥有的是 ITest
中 y
属性 的 get
访问器的 MethodInfo
。要查找 属性 本身,请参见例如this answer to Finding the hosting PropertyInfo from the MethodInfo of getter/setter。获得 属性 信息后,检查其自定义属性以查找 My1Attribute
及其值 x
.
我一直在尝试使用已在接口中声明的 属性 的属性。
假设:
[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
.
在你的例子中,Child
implements 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; }
}
这只是一个草图,不是详细的答案。它应该让您了解如何找到该属性,从 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
。因此,您拥有的是 ITest
中 y
属性 的 get
访问器的 MethodInfo
。要查找 属性 本身,请参见例如this answer to Finding the hosting PropertyInfo from the MethodInfo of getter/setter。获得 属性 信息后,检查其自定义属性以查找 My1Attribute
及其值 x
.