3

コード

public class Test
{
    public int id{get;set;}
    public Type test{get;set;}
}    

public object Convert<T1, T2>()
{ 
    //do stuff        
}

public void DoConvert()
{
    var a = Convert<Test, Test>(); // This Works

    var t = new Test() { test = typeof(Test); }
    var b = Convert<t.test, t.test>(); // This does not work!
}

問題

上記のコードで述べたように。実行時にT1とT2が定義されている場合、Convertメソッドを機能させるにはどうすればよいですか?

4

3 に答える 3

3

Type.MakeGenericTypeで結果を取得するには、ユーザー リフレクションが必要ですConvertメソッドが静的Tempクラス内にあると仮定します。

class Temp
{
    public static object Convert<T1, T2>()
    { 
        //do stuff        
    }
}

次に、次のように呼び出すことができます。

// assume code to get type1 and type2 dynamically
var type1 = GetGetType1();
var type2 = GetGetType2();

var method =  typeof(Temp).GetMethod("Convert")
                             .MakeGenericMethod(type1, type2);

method.Invoke(null, null);  //assume Convert is static method
于 2013-02-22T10:48:19.107 に答える
0

Type.MakeGenericTypeはここであなたの友達です。そのように実行時にジェネリック型を作成することはできません。リフレクションを使用する必要があります。ただし、静的型が失われることに注意する必要があります。

于 2013-02-22T10:41:05.713 に答える
0

T1 と T2 が実行時に定義されている場所で Convert メソッドを機能させるにはどうすればよいですか?

リフレクションまたはランタイム コード生成が唯一のオプションです。

コンパイルされたコードのテンプレートは、コンパイラによって解決される必要があります。したがって、ASP.NET で行われるように、実行時にコードを作成してコンパイルします (コンパイラは実行時の一部です)。または、リフレクションを使用してコンパイルを回避します (他の回答ノート: Type.MakeGenericTypeMyType<>を使用すると、T取得することができますMyType<T>)。

一般的なメソッドを使用する場合MethodInfo.MakeGenericMethod

于 2013-02-22T10:42:48.560 に答える