1

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

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

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

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

有没有一种方法可以在不使用反射的情况下达到相同的结果?

问候,贾科莫

4

3 回答 3

2

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

于 2013-01-09T07:44:52.037 回答
2

是的,这就是属性的创建方式——它们使用编译时常量作为参数。但是对于在此类属性构造函数中执行的代码没有限制,因此解决方法是继承表单属性:

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

并使用那个:

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

MyAttrAttribute如果你要求,你会得到polimorfizm 的实例MyClassMyAttrAttribute

于 2013-01-09T08:04:18.113 回答
1

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

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

[DefaultValue(typeof(Color), "Red")]
public Color HighlightColor {get; set;}

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

于 2013-01-09T08:07:39.473 回答