2015-01-02 11 views
5

から一般的な方法の実数型を取得します。私はラインを持っている私のロギングモジュールでたStackFrame

MethodBase methodBase = new StackFrame(2, false).GetMethod();

私は検査方法が一般的な方法であり、T[] MyMethod<T>()として定義されています。 Tの代わりに実際のタイプを取得する方法はありますか?methodBase

+0

あなたは 'GetGenericArguments'を使用できますか? –

+0

何が起こっているのか、質問をより良くしようとしたのかを示す小さなサンプルを追加することを検討してください。 –

+0

詳細については、同様の質問http://stackoverflow.com/questions/14707298/get-generic-argument-type-and-value-supplied-to-a-generic-methodがあります。 –

答えて

4

私が知る限り、これを行うことはできません。 StackFrameの情報は、実行時情報ではなく、.pdb情報から取得され、スタックフレーム内で見つかったリターンアドレスと、.pdbに記述されているアセンブリオフセットが対応付けられています。私。コンパイル時の情報のみが利用可能ですが、オープンな汎用メソッドです。

クローズドジェネリックメソッドを手動で作成して直接呼び出す場合でも、はまだ .pdbからオープンジェネリックメソッドを取得することに注意してください。例:上記の例で

class Program 
{ 
    static void Main(string[] args) 
    { 
     MethodInfo miOpen = typeof(Program).GetMethod("Method", BindingFlags.Static | BindingFlags.NonPublic), 
      miClosed = miOpen.MakeGenericMethod(typeof(int)); 

     Type type; 

     object[] invokeArgs = { 17, null }; 
     int[] rgi = (int[])miClosed.Invoke(null, invokeArgs); 

     type = (Type)invokeArgs[1]; 
    } 

    static T[] Method<T>(T t, out Type type) 
    { 
     type = GetMethodType(); 

     return new[] { t }; 
    } 

    private static Type GetMethodType() 
    { 
     StackFrame frame = new StackFrame(1, false); 
     MethodBase mi = frame.GetMethod(); 

     return mi.GetGenericArguments()[0]; 
    } 
} 

、最後に割り当てられたtype変数値は、まだあなたがあなたのケースに望んでいるだろうとしていないInt32、オープンジェネリックメソッドの{T}タイプを参照します。これは、Int32タイプであるにもかかわらず、miClosed可変参照から検索可能であるという事実にもかかわらず、

特定のタイプ情報が必要な場合は、コードに明示的に決定するメカニズムを提供する必要があります(たとえば、typeof(T)の値を汎用メソッド自体のロギングコンポーネントに渡す)。 StackFrameクラスには、あなたのために必要な情報がありません。

-1

MethodBaseGetGenericArgumentsを使用して、Tに渡された内容を取得します。

+0

私はここに投稿する前に 'GetGenericArguments'を試しましたが、そこには本当の型名がなく、' T [] 'しかありません。 – Denis

関連する問題