将非常量值设置为属性的解决方法

本文关键字:属性 解决 方法 设置 非常 常量 | 更新日期: 2023-09-27 17:51:08

假设我有一个能够设置为System的属性。对象说:

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

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

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

有一种方法来实现相同的结果,而不使用反射?

将非常量值设置为属性的解决方法

属性根本不适合这种情况。通常使用反射并不能真正解决问题,因为不能保证在检查属性的调用之间分配的值将被保留。

是的,这就是创建属性的方式——它们使用编译时常量作为参数。但是对于在这个属性构造函数中执行的代码没有限制所以变通方法是继承form attribute:

[AttributeUsage(AttributeTargets.Property)]
class MyClassMyAttrAttribute:MyAttrAttribute 
{
    MyClassMyAttrAttribute()
    {
        ThisOne = new MyClass();
    }
}

,使用

 [MyClassMyAttr]
 public MyClass Thing { get; set; }

,根据多元形的优点,如果你要求MyAttrAttribute,你会得到MyClassMyAttrAttribute的实例

例如,DefaultValue属性有一个Type, String构造函数。这可以用来创建一个实例,例如所需的时间跨度或所需的颜色:

[DefaultValue(typeof(TimeSpan), "00:00:03")]
public TimeSpan Timeout {get; set;}
[DefaultValue(typeof(Color), "Red")]
public Color HighlightColor {get; set;}

也许这种创建属性值的方式可以帮助你找到解决问题的方法