3

私はこのような方法を持っています、

public List<T> Test<T>()
{
    // do something.
}

Tが何であるかわかりません。持っていません。しかし、私はTYPEとしてTのタイプを持っています。

例えば:

class Person
{

}

var type = typeof(Person);

私は人を持っていません。Person は type オブジェクトを保持しています。

テストメソッドはどのように使用できますか?

var list = Test<type>(); // It gives an error like this. I must use the type object.
4

5 に答える 5

7

MakeGenericMethod次のメソッドを使用できますMethodInfo

MethodInfo info = this.GetType().GetMethod("Test").MakeGenericMethod(type);
object result = info.Invoke(this, null);

これは、 を定義するのと同じ型内でメソッドを呼び出すことを前提としていますTest。他の場所から呼び出す場合は、 のtypeof(ClassThatDefinesTest)代わりに を使用し、 の代わりthis.GetType()にこのクラスのインスタンスを使用しますthis

于 2012-06-14T12:29:28.333 に答える
1

本当に必要なだけであればtypeof(T)、次のようにリファクタリングできます。

public void Test(Type t)
{
    // do something.
}

そして、次のように呼び出します。

Test(type);

これがうまくいかない場合は、 を使用した Botz3000 のソリューションをお勧めしMakeGenericMethodます。

両方Test<T>()を公開してから、静的型が必要か、単にランタイム型が必要かによって、(またはTest(Type)を使用して) 一方から他方を呼び出すことができます。そうすれば、発信者は 2 つのうちどちらが必要かを知る必要がありません。MakeGenericMethodtypeof(T)

于 2012-06-14T12:57:48.923 に答える
0

@ Botz3000が述べたように、 MakeGenericMethod()メソッドを使用できます。dynamicしかし、別の解決策として、キーワードとActivatorクラスのCreateInstance()メソッドを使用することもできます。

public void Test(Type type)
{
    dynamic myVariable = Activator.CreateInstance(type);          
    // do something, like use myVariable and call a method: myVariable.MyMethod(); ...
}
于 2012-06-14T12:42:28.493 に答える
0

クラス名をそれに渡しました。次の MSDN を参照してください。

http://msdn.microsoft.com/en-us/library/twcad0zb(v=vs.100).aspx

于 2012-06-14T12:29:15.930 に答える
-1

次のように呼び出します。

Test<Person>();
于 2012-06-14T12:28:20.310 に答える