3

我有这样的方法,

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

我不知道什么是 T 并且没有。但我有 T 类型作为 TYPE。

例如:

class Person
{

}

var type = typeof(Person);

我没有人。Person 保持在类型对象上。

如何使用测试方法?

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);

如果这对您不起作用,我推荐使用MakeGenericMethod.

您可以同时公开两者Test<T>()Test(Type)然后调用另一个(使用MakeGenericMethodtypeof(T)),具体取决于您需要静态类型还是仅需要运行时类型。这样,您的呼叫者就不需要知道您需要两者中的哪一个。

于 2012-06-14T12:57:48.923 回答
0

您已将类名称传递给它。请参考以下MSDN,

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

于 2012-06-14T12:29:15.930 回答
0

正如@Botz3000 所说,您可以使用MakeGenericMethod()方法。但另一种解决方案是使用Activator类中的dynamic关键字和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 回答
-1

你这样称呼它:

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