67

C# でカスタム属性を作成していますが、属性がメソッドとプロパティのどちらに適用されるかに基づいて、さまざまなことをしたいと考えています。最初はnew StackTrace().GetFrame(1).GetMethod()、カスタム属性コンストラクターで、どのメソッドが属性コンストラクターを呼び出しているかを確認するつもりでしたが、今では何が得られるかわかりません。属性がプロパティに適用された場合はどうなりますか? そのプロパティのインスタンスをGetMethod()返しますか? MethodBaseC#で属性が適用されたメンバーを取得する別の方法はありますか?

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Property,
    AllowMultiple = true)]
public class MyCustomAttribute : Attribute

更新: わかりました、間違った質問をしている可能性があります。カスタム属性クラス内から、カスタム属性が適用されたメンバー (またはメンバーを含むクラス) を取得するにはどうすればよいですか? Aaronaughtは、自分の属性が適用されたクラス メンバーを見つけるためにスタックをたどらないことを提案しましたが、属性のコンストラクター内からこの情報を取得するにはどうすればよいでしょうか?

4

4 に答える 4

45

属性はメタデータを提供し、装飾しているもの (クラス、メンバーなど) については何も知りません。一方、装飾されているものは、装飾されている属性を要求できます。

装飾されているもののタイプを知る必要がある場合は、コンストラクターで属性に明示的に渡す必要があります。

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, 
    AllowMultiple = true)] 
public class MyCustomAttribute : Attribute
{
   Type type;

   public MyCustomAttribute(Type type)
   {
      this.type = type;
   }
}
于 2010-01-30T20:47:37.680 に答える