你能在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并查看您获得的内容。