2010-09-24 66 views
1

有没有一种方法可以让应用于方法的属性知道它在运行时应用了什么方法?一个属性可以在运行时发现它应用于什么方法?

[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(); 

可以在“属性”告诉它应用到了“法”的方法对“富”类?

+0

我打算使用该属性为该方法设置友好名称,如果未提供,则默认回到全名。这用作授权方案的一部分,其名称将在数据库中查找。 – Jason 2010-09-25 02:03:45

回答

0

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

+0

我在属性中创建了第二个属性,我将其设置为方法的名称。然后在属性里面我做一些逻辑来使用正确的属性值。无论是由用户设置的还是代码设置的。我希望不必设置额外的财产。 – Jason 2010-09-25 02:01:47

5

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

我会解释一下。

只有在查询它们后才会创建属性。如果你只是打开一个DLL,你创建的属性都不会被创建。你首先必须得到一个指向属性适用对象的指针,然后,一旦你要求它的属性,.NET框架就会为你创建它们。因此,当他们被实例化并且您的代码得到评估时,您已经知道它们适用于什么。

因此,我认为建议不要在属性本身中放置太多魔法。

+0

在这种情况下,我使用该属性来创建友好名称。如果没有提供,我希望它默认为全名。 (如方法名称是友好名称)。 – Jason 2010-09-25 01:59:03

相关问题