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

はい、これが属性の作成方法です-コンパイル時の定数をパラメーターとして使用します。ただし、そのような属性コンストラクターで実行されるコードに関する制限はないため、回避策は form 属性を継承することです。

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

そしてそれを使用します:

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

また、polimorfizm の良さによって、求めると のMyAttrAttributeインスタンスが得られます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 に答える