如何将类型变量发送到泛型方法

本文关键字:泛型方法 类型变量 | 更新日期: 2023-09-27 18:37:05

我有这样的方法,

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

我不知道什么是T,也没有。但是我有T类型作为类型。

例如:

class Person
{
}
var type = typeof(Person);

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

如何使用测试方法?

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

如何将类型变量发送到泛型方法

您可以使用 MethodInfo 中的 MakeGenericMethod 方法:

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

这是假设您在定义 Test 的同一类型中调用该方法。如果从其他地方调用它,请使用 typeof(ClassThatDefinesTest) 而不是 this.GetType() ,并使用此类的实例而不是 this

如果你真正需要typeof(T),那么你可以将其重构为:

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

并像这样称呼它:

Test(type);

如果这对您不起作用,我建议使用 Botz3000 的解决方案使用 MakeGenericMethod .

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

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

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

如前所述@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(); ...
}

你这样称呼它:

Test<Person>();