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

本文关键字:一个 属性 实例 动态 应用于 列表 | 更新日期: 2023-09-27 18:01:06

我在一个类上定义了多个属性:

[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在运行时向类型添加类级属性:

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

作为另一个选项,您可以为您的类型创建CustomTypeDescriptor。在自定义类型描述符中,为类型的属性返回自定义PropertyDescriptor对象,在属性描述符中为属性返回一组自定义属性。属性描述符中的关键点是覆盖Attributes属性。然后创建一个TypeDescriptionProvider并为您的类型注册它,以提供自定义类型描述。通过这种方式,您可以使用单个属性而不是所有这些属性。

要查看实现,请查看这篇文章:组合控件属性。