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
,那个么感觉就像是设计问题,你们可能解决了错误的问题。