使用列表将属性的多个实例动态应用到 属性
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:。
我在 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: