使用列表将一个属性的多个实例动态应用于一个属性
本文关键字:一个 属性 实例 动态 应用于 列表 | 更新日期: 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
并为您的类型注册它,以提供自定义类型描述。通过这种方式,您可以使用单个属性而不是所有这些属性。
要查看实现,请查看这篇文章:组合控件属性。