から一般的な方法の実数型を取得します。私はラインを持っている私のロギングモジュールでたStackFrame
MethodBase methodBase = new StackFrame(2, false).GetMethod();
私は検査方法が一般的な方法であり、T[] MyMethod<T>()
として定義されています。 T
の代わりに実際のタイプを取得する方法はありますか?methodBase
?
から一般的な方法の実数型を取得します。私はラインを持っている私のロギングモジュールでたStackFrame
MethodBase methodBase = new StackFrame(2, false).GetMethod();
私は検査方法が一般的な方法であり、T[] MyMethod<T>()
として定義されています。 T
の代わりに実際のタイプを取得する方法はありますか?methodBase
?
私が知る限り、これを行うことはできません。 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
クラスには、あなたのために必要な情報がありません。
MethodBase
のGetGenericArguments
を使用して、T
に渡された内容を取得します。
私はここに投稿する前に 'GetGenericArguments'を試しましたが、そこには本当の型名がなく、' T [] 'しかありません。 – Denis
あなたは 'GetGenericArguments'を使用できますか? –
何が起こっているのか、質問をより良くしようとしたのかを示す小さなサンプルを追加することを検討してください。 –
詳細については、同様の質問http://stackoverflow.com/questions/14707298/get-generic-argument-type-and-value-supplied-to-a-generic-methodがあります。 –