如何将类型变量发送到泛型方法
本文关键字:泛型方法 类型变量 | 更新日期: 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)
,然后让一个调用另一个(使用 MakeGenericMethod
或 typeof(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>();