使用列表将属性的多个实例动态应用到 属性

Dynamically apply multiple instances of an Attribute to a Property using a list

我在 class 上定义了多个属性:

[CustomAttribute("a", state = 0)]
[CustomAttribute("b", state = 0)]
...
[CustomAttribute("z", state = 0)]
public class MyClass { ... }

值("a""b"、一直到 "z")也在程序的其他地方使用,所以现在,我有一个重复的名称数组。

public static readonly string[] listOfNames = new [] { "a", "b", ..., "z" };

我可以使用反射从属性中恢复名称来构建 listOfNames,但是有没有办法反过来并从 listOfNames 中定义属性?我怀疑不是,但是有没有更清晰的方法至少避免重复 CustomAttribute 位?

您可以使用 TypeDescriptor.AddAttributes 在 运行 时将 class 级属性添加到类型:

string[] listOfNames = new [] { "a", "b", "c" };
var attributes = listOfNames.Select(x=>new CustomAttribute(x)).ToArray();
TypeDescriptor.AddAttributes(typeof(MyClass), attributes);

此外,您还可以创建一个 CustomTypeDescriptor for your type. In the custom type descriptor, you return custom PropertyDescriptor objects for the properties of your type and in the property descriptor, you return a custom set of attributes for the property. The key point in property descriptor is overriding Attributes property. Then create a TypeDescriptionProvider 并为您的类型注册它以提供自定义类型描述。这样您就可以使用单个属性而不是所有这些属性。

要查看实现,请查看此 post: