1. ホーム
  2. c#

[解決済み】.NETの属性とは何ですか?

2022-04-13 06:03:23

質問

.NETにおける属性とは何ですか、何に使うのですか、また、独自の属性を作成するにはどうすればよいですか?

どのように解決するのですか?

メタデータ。オブジェクト/メソッド/プロパティに関するデータ。

例えば、次のようなAttributeを宣言します。これにより、UIに表示されるプロパティの順番を簡単に制御することができる。そして、この属性をクラスに追加し、属性を抽出してUI要素を適切に並べるGUIコンポーネントを書くことができる。

public class DisplayWrapper
{
    private UnderlyingClass underlyingObject;

    public DisplayWrapper(UnderlyingClass u)
    {
        underlyingObject = u;
    }

    [DisplayOrder(1)]
    public int SomeInt
    {
        get
        {
            return underlyingObject .SomeInt;
        }
    }

    [DisplayOrder(2)]
    public DateTime SomeDate
    {
        get
        {
            return underlyingObject .SomeDate;
        }
    }
}

これにより、私のカスタムGUIコンポーネントで作業する場合、SomeIntが常にSomeDateの前に表示されることを保証します。

しかし、直接のコーディング環境以外では、最も一般的に使用されているのを見ることができます。例えば、Windowsデザイナーは、カスタムメイドのオブジェクトをどのように扱うかを知るために、これらを広範囲に使用します。BrowsableAttributeをこのように使用します。

[Browsable(false)]
public SomeCustomType DontShowThisInTheDesigner
{
    get{/*do something*/}
}

例えば設計時にプロパティウィンドウで利用可能なプロパティにこれをリストアップしないようにデザイナーに指示します。

あなたは できる また、コード生成、プリコンパイル操作(Post-Sharpなど)、Reflection.Emitなどのランタイム操作に使用することもできます。 例えば,プロファイリングのために,コードが行うすべての呼び出しを透過的にラップして時間を計測するコードを少し書くことができます.特定のメソッドに配置する属性によって、タイミングをオプトアウトすることができます。

public void SomeProfilingMethod(MethodInfo targetMethod, object target, params object[] args)
{
    bool time = true;
    foreach (Attribute a in target.GetCustomAttributes())
    {
        if (a.GetType() is NoTimingAttribute)
        {
            time = false;
            break;
        }
    }
    if (time)
    {
        StopWatch stopWatch = new StopWatch();
        stopWatch.Start();
        targetMethod.Invoke(target, args);
        stopWatch.Stop();
        HandleTimingOutput(targetMethod, stopWatch.Duration);
    }
    else
    {
        targetMethod.Invoke(target, args);
    }
}

宣言は簡単で、Attributeを継承したクラスを作成するだけです。

public class DisplayOrderAttribute : Attribute
{
    private int order;

    public DisplayOrderAttribute(int order)
    {
        this.order = order;
    }

    public int Order
    {
        get { return order; }
    }
}

また、attributeを使用する際には、quot;attribute"というサフィックスを省略することができることを忘れないでください。

注意 属性はそれ自体では何もしません。属性を使用する他のコードが必要です。それを使う他のコードが必要なのです。そのコードはすでに書かれていることもあれば、自分で書かなければならないこともあります。例えば、C#コンパイラはあるものを気にしますし、あるフレームワークではあるものを使います(例えば、NUnitはアセンブリをロードするときにクラスの[TestFixture]とテストメソッドの[Test]を探します)。

したがって、独自のカスタム属性を作成する場合は、コードの動作にまったく影響を与えないことを認識しておいてください。属性をチェックする他の部分を(リフレクションを使って)書き、それに基づいて動作させる必要があるのだ。