你能在C#中获得一个类的合并属性吗?
假设我有以下一组类,是否可以合并DerivedClass的属性? 目前,如果我使用GetType()。GetCustomAttributes()方法传入trueinheritance,它将获取inheritance结构中的最高属性。
即[另一个(“鲍勃”)]和[我的(16)]
是否可以合并属性? 所以我最终会得到[My(16,“Male”)]和[Another(“Bob”)]的两个属性
我并不是说我会指定[My(16,“Male”)]的属性,而是返回一个年龄为16,性别为男性的属性。
public class MyAttribute : Attribute { public MyAttribute(int age) { Age = age; } public MyAttribute(int age, string gender) { Age = age; Gender = gender; } public int Age { get; set; } public string Gender { get; set; } } public class AnotherAttribute : Attribute { public AnotherAttribute(string name) { Name = name; } public string Name { get; set; } } [My(12, "Male")] [Another("Bob")] public class BaseClass { } [My(16)] public class DerivedClass : BaseClass { }
您可以在实体上拥有同一属性的多个实例(这是应用于您的属性的AttributeUsageAttribute
上的一个选项)。 获取类型的属性时,可以获取应用于inheritance链的所有属性。
但是,标准工具中没有任何内容可以使用两个属性实例并生成一个。
(理论上,重写MSIL的后处理器可以做到这一点。)
首先,我不相信您要查询的任何行为将取决于应该装饰您的属性类的AttributeUsage
属性( 看起来我可能是错的 )。 我也没有看到任何属性合并的位置。 每个属性都是一个类本身的表示。 每个属性类都应该返回它自己的数据。 我希望DerivedClass.GetCustomAttributes()
为每个属性返回三个单独的引用 – 从基类返回2,为自己返回1。
尝试在’MyAttribute’上设置AttributeUsage以允许多个。 它可能不是合并它们,而是采用属性的“最新”版本。
我只想到了可能导致神秘消失行为的其他事情。 您可能需要在base
类之后获取原始属性? 你可以尝试:
base.GetType().GetCustomAttributes();
我做了一些挖掘,这是AttibuteUsage
将要做的事情,并且可能导致您只看到一个MyAttribute
类:
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]
我之前在声明中接近使用AttributeUsage
; 但是,它是Inherited
命名参数,它将限制对基类’ MyAttribute
修饰的可见性。 尝试指定Inherited = true
并查看您获得的内容。