2011-05-13 62 views
2

是否有可能在一个属性构造函数来获取具有分配给它的属性的类,而不需要在传递类名。获得在C#中的属性类

[MyAttr] 
    public class A{} 

    [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] 
    [Serializable] 
    public class MyAttrAttribute: Attribute 
    { 
     public MyAttrAttribute() 
     { 
      //get info here about the class A etc 
     }  
    } 

回答

2

不可以,但为什么你想去做这个?你想达到什么目的?

当您在运行时检索属性时,您可以从代表该类的类型对象中执行此操作。所以即使信息没有存储在属性对象中,它也是可用的。

+0

“你从代表该类的类型对象中这样做” - 要更清楚一点,你需要从'Type'中获取属性,它表示*的所有*实例上课......所以你不一定*有一个实例 – 2011-05-13 06:42:03

+1

为了审计的目的,我需要在每个类上放置一个属性,属性表示审计伙伴类,几乎在所有情况下,伙伴类的命名与原来的“审计”相同,因此, d喜欢有一个默认的构造函数,当你不给任何赋值时它使用这个默认的约定 – 2011-05-13 06:45:42

+0

@Mark,Type对象并不代表该类的所有实例,它代表了类本身。 @Danielhttp,我会做一个帮手来获得好友类;该方法将检索该属性,并且如果该属性处于其默认状态(或者完全缺失),这意味着默认约定。 – phoog 2011-05-13 06:55:33

0

这将是一个方便的功能,很好的问题。但从根本上来说,属性仅仅意味着检查员不是检查员的元数据 - 他们是不变的数据。

3

属性实例完全独立于它们修饰的类型/字段/属性;从属性访问上下文绝对没有办法。但是,除非使用反射显式查询属性,否则属性也不会创建为

如果你想调用一些逻辑,那么它必须被明确地通过代码实现 - 那么你可以考虑在你的属性接受上下文对象添加一个方法:

public void Invoke(object instance) {...} 

例如,然后使用GetCustomAttribute获取它,然后调用它,然后调用.Invoke()