2009-08-28 10 views
8

ここではAAtributeという名前のカスタム属性を作成しました。たとえば、Bという名前のクラスがあります。この属性(この場合はBMethod1)を保持するメソッドのMethodInfoを、アセンブリ全体を歩き回ることなく、属性に定義されたすべてのメソッドを調べることなく(属性の1つとして)取得することは可能ですか?他のAttributeTargets(パラメータ/タイプ/プロパティ/ ...)のための彼らのアナログ方法ですか?このタイプのAttributeを使用するすべてのメソッドの配列が必要ではありませんが、このAttirbuteオブジェクトを持つメソッドだけが特定のものになります。私はメソッド(戻り値の型、パラメータ、名前、他の属性の使用法、...)に追加の制約を加えるために、このメソッドを使いたい。C#の属性を保持する型/メソッド/ ...への高速アクセス

[AttributeUsage(AttributeTargets.Method)] 
public class AAtribute : Attribute { 

    //some fields and properties 

    public AAtribute() {//perhaps with some parameters 
     //some operations 
     MethodInfo mi;//acces to the MethodInfo with this Attribute 
         //as an Attribute (the question) 
     //some operations with the MethodInfo 
    } 

    //some methods 

} 

public class B { 

    //some fields, properties and constructors 

    [A] 
    public void BMethod1() { 
     //some operations 
    } 

    //other methods 

} 
+0

良い質問ですが、私も答えを知りたいのですが... –

答えて

2

質問が正しく理解されていれば、属性コード、、属性が適用されているオブジェクト(ここではメソッド)を取得します。
これを行う直接的な方法はないと確信しています。属性は、それがアタッチされているオブジェクトについての知識がなく、この関連付けは逆です。

最高の私はあなたを提案することができますがあり、以下のような回避策:

using System; 
using System.Reflection; 

namespace test { 

    [AttributeUsage(AttributeTargets.Method)] 
    public class AAttribute : Attribute { 
     public AAttribute(Type type,string method) { 
      MethodInfo mi = type.GetMethod(method); 
     } 
    } 

    public class B { 
     [A(typeof(B),"BMethod1")] 
     public void BMethod1() { 
     } 
    } 
} 

NOTE
あなたは、属性のコンストラクタ内METHODINFOにアクセスすることで達成したいですか?たぶん、あなたの目標を取得する別の方法...別の可能な解決策として

EDIT

があります、あなたがチェックを行い、あなたの属性の静的メソッドを提供するかもしれない - しかし、これはMethodInfos上で反復処理を必要とします。

using System; 
using System.Reflection; 
namespace test { 

    [AttributeUsage(AttributeTargets.Method)] 
    public class AAttribute : Attribute { 
     public static void CheckType<T>() { 
      foreach (MethodInfo mi in typeof(T).GetMethods()) { 
       AAttribute[] attributes = (AAttribute[])mi.GetCustomAttributes(typeof(AAttribute), false); 
       if (0 != attributes.Length) { 
        // do your checks here 
       } 
      } 
     } 
    } 

    public class B { 
     [A] 
     public void BMethod1() { 
     } 
     [A] 
     public int BMethod2() { 
      return 0; 
     } 
    } 

    public static class Program { 
     public static void Main() { 
      AAttribute.CheckType<B>(); 
     } 
    } 
} 
+0

すでに述べたように、私はadditiol制約(戻り値の型、パラメータの数、パラメータの型、メソッドの名前など)を追加したいと思います。メソッドが有効でない場合、例外がスローされる可能性があります。しかし、その理由が何であれ、アトリビュートがリンクされているものにアクセスできるというのは論理ではありませんか? –

+0

はい、しかし、あなたはそれらの制約で何をしたいですか?どのような場合でも、型を反映させるまで、属性はインスタンス化されません。 –

0

メソッドに属性が適用されているかどうかを調べるには、すでにMethodInfoがあります。

var type = obj.GetType(); 
foreach(var method in type.GetMethods()) 
{ 
    var attributes = method.GetCustomAttributes(typeof(AAtribute)); 
    if(attributes.Length > 0) 
    { 
     //this method has AAtribute applied at least once 
    } 
}

+0

ええ、しかし、あなたはその属性の中からどのようにしていますか?属性の現在のインスタンスがどのメソッド(またはメンバ)に適用されているかを知る方法はありますか? –

2

私は答えがノーだと思います。少なくとも合理的な方法ではない。属性のインスタンスは、MethodInfoを介して属性を検索した場合にのみ構築されます。属性を持つメソッドを持つクラスをインスタンス化しても、その属性はインスタンス化されません。アトリビュートインスタンスは、リフレクションを通してそれらを見つけるために突き刺さって初めて作成されます。

関連する問題