c#:为属性设置非常量值的解决方法?

时间:2013-01-09 07:42:01

标签: c# attributes

假设我有一个属性可以设置为System.Object说:

[AttributeUsage(AttributeTargets.Property)]
class MyAttrAttribute : Attribute {
  public object ThisOne { get; set; }
}

我想得到相同的结果(不能编译):

class AttrTarget {
  [(MyAttr ThisOne = new MyClass())]
  public MyClass Thing { get; set; }
}

有一种方法可以在不使用反射的情况下获得相同的结果吗?

关心,贾科莫

3 个答案:

答案 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;}

因此,这种创建属性值可能会帮助您了解如何解决问题。