属性是否可以在运行时发现它应用于哪种方法?

时间:2010-09-24 18:52:35

标签: c# .net attributes metadata

是否有办法让已应用于某个方法的属性知道它在运行时应用了哪种方法?

[AttributeUsage(AttributeTargets.Method)]
public class CustomAttribute : Attribute {}

public class Foo
{
    [Custom]
    public void Method() {}
}

然后我在运行时查询属性

var attribute = typeof(Foo)
    .GetMethod("Method")
    .GetCustomAttributes(false)
    .OfType<CustomAttribute>()
    .First();

“属性”可以告诉它应用于“Foo”类的“Method”方法吗?

2 个答案:

答案 0 :(得分:5)

我不相信,但如果它可能没有帮助。

我会解释。

只有在查询属性后才会创建属性。如果您只是打开一个dll,则不会创建您添加的任何属性。您首先必须获得指向属性所适用的对象的指针,然后,一旦您要求它的属性,.net框架将为您创建它们。因此,当它们被实例化并且您的代码进行评估时,您已经知道它们适用的内容。

正因为如此,我相信建议不要在属性本身中加入过多的魔力。

答案 1 :(得分:0)

不是内置的方式。如果属性包含需要了解其装饰的方法逻辑,则该方法应采用MemberInfo参数(或更多派生类型,如MethodInfo,PropertyInfo,FieldInfo等),或者如果实例应直接传递,则采用Object。然后,当在属性上调用逻辑时,可以给出实例或适当的元数据类,首先由控制代码从中获取它。