C#:如何使用字符串为泛型方法指定类型(T)?
我有一些丑陋的代码,看起来像这样:C#:如何使用字符串为泛型方法指定类型(T)?,c#,generics,delegates,C#,Generics,Delegates,我有一些丑陋的代码,看起来像这样: switch (f.TypeName) { case "TypeOne": ThreadPool.QueueUserWorkItem(new WaitCallback(MyMethod<TypeOne>), args); break; case "TypeTwo": ThreadPool.QueueUserWorkItem(new
switch (f.TypeName)
{
case "TypeOne":
ThreadPool.QueueUserWorkItem(new WaitCallback(MyMethod<TypeOne>), args);
break;
case "TypeTwo":
ThreadPool.QueueUserWorkItem(new WaitCallback(MyMethod<TypeTwo>), args);
break;
...
case "TypeTwenty":
ThreadPool.QueueUserWorkItem(new WaitCallback(MyMethod<TypeTwenty>), args);
break;
}
protected void MyMethod<T>(object args)
{
...
}
开关(f.TypeName)
{
“TypeOne”案例:
QueueUserWorkItem(新的WaitCallback(MyMethod),args);
打破
案例“第二类”:
QueueUserWorkItem(新的WaitCallback(MyMethod),args);
打破
...
案例“Type二十”:
QueueUserWorkItem(新的WaitCallback(MyMethod),args);
打破
}
我真的想摆脱switch语句,按照以下思路做一些事情:
var myTypeDescriptor = Type.GetType(f.TypeName); //<== clearly not this, but similar
ThreadPool.QueueUserWorkItem(new WaitCallback(MyMethod<myTypeDescriptor>), args);
var myTypeDescriptor=Type.GetType(f.TypeName)// 如果可以从您拥有的字符串创建类型的实例(如果您知道它们是完全限定的),则可以使用MethodInfo.MakeGenericMethod(Type[]typeArguments)
看一看。这里是简单的想法
var type = Type.GetType(f.TypeName);
var methodInfo = typeof(MethodHoderType).GetMethod("MyMethod");
var constructedMethodInfo = methodInfo.MakeGenericMethod(type);
constructedMethodInfo.Invoke(...);
如果是实例方法,则应创建类型为type
的实例,以传递给Invoke
方法,如果是静态方法,则将null
作为第一个参数传递
查看和了解更多信息。希望这对您有所帮助。只需构建一个decorator来接受对项目进行排队的类型,而不是字符串
class Program
{
static void Main(string[] args)
{
var arguments = new object();
Execute<ObjectA>(args);
Execute<ObjectB>(args);
Execute<ObjectC>(args);
Execute<ObjectA>(args);
Console.ReadLine();
}
static void Execute<T>(object args) where T:BaseObject
{
ThreadPool.QueueUserWorkItem(new WaitCallback(MyMethod<T>), args);
}
static void MyMethod<T>(object args) where T:BaseObject
{
Console.WriteLine(typeof(T).FullName);
}
}
public class BaseObject
{
}
public class ObjectA : BaseObject
{
}
public class ObjectB : BaseObject
{
}
public class ObjectC : BaseObject
{
}
类程序
{
静态void Main(字符串[]参数)
{
var参数=新对象();
执行(args);
执行(args);
执行(args);
执行(args);
Console.ReadLine();
}
静态void Execute(对象参数),其中T:BaseObject
{
QueueUserWorkItem(新的WaitCallback(MyMethod),args);
}
静态void MyMethod(对象参数),其中T:BaseObject
{
Console.WriteLine(typeof(T).FullName);
}
}
公共类基对象
{
}
公共类ObjectA:BaseObject
{
}
公共类ObjectB:BaseObject
{
}
公共类ObjectC:BaseObject
{
}
如何使用MyMethod
中的泛型参数?能否创建一个采用显式类型
参数的版本?能否显示MyMethod
的实现?你太简单了。若输入或输出中的任何地方都没有使用T
,那个么感觉就像是设计问题,你们可能解决了错误的问题。