假设我有一个属性可以设置为System.Object说:
[AttributeUsage(AttributeTargets.Property)]
class MyAttrAttribute : Attribute {
public object ThisOne { get; set; }
}
我想得到相同的结果(不能编译):
class AttrTarget {
[(MyAttr ThisOne = new MyClass())]
public MyClass Thing { get; set; }
}
有一种方法可以在不使用反射的情况下获得相同的结果吗?
关心,贾科莫
答案 0 :(得分:2)
属性根本不适合那种情况。使用反射通常并不能真正解决问题,因为无法保证在检查属性的调用之间保留分配的值。
答案 1 :(得分:2)
是的,这就是如何创建属性 - 它们使用编译时常量作为参数。但是对于在这样的属性构造函数中执行的代码没有限制,因此解决方法是继承表单属性:
[AttributeUsage(AttributeTargets.Property)]
class MyClassMyAttrAttribute:MyAttrAttribute
{
MyClassMyAttrAttribute()
{
ThisOne = new MyClass();
}
}
并使用那个:
[MyClassMyAttr]
public MyClass Thing { get; set; }
如果你要求MyAttrAttribute
,你可以获得polimorfizm的优点,你会获得MyClassMyAttrAttribute
的实例。
答案 2 :(得分:1)
DefaultValue
属性例如Type, String
constructor。这可用于创建实例,例如对于所需的时间跨度或所需的颜色:
[DefaultValue(typeof(TimeSpan), "00:00:03")]
public TimeSpan Timeout {get; set;}
[DefaultValue(typeof(Color), "Red")]
public Color HighlightColor {get; set;}
因此,这种创建属性值可能会帮助您了解如何解决问题。