C#:如何使用字符串为泛型方法指定Type(T)?

时间:2017-11-13 21:30:20

标签: c# generics delegates

我有一些丑陋的代码看起来像这样:

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

我真的想摆脱switch语句并按照这些方式做点什么:

    var myTypeDescriptor = Type.GetType(f.TypeName); //<== clearly not this, but similar
    ThreadPool.QueueUserWorkItem(new WaitCallback(MyMethod<myTypeDescriptor>), args);

MyMethod看起来像这样:

    protected void MyMethod<T>(object args)
    {
        ...
    }

我已经在一些人身上发现了很多例子,其中泛型是一个泛型类,但没有一个例子,它是一个通用的方法。绝对没有任何将它传递给代表的例子。

虽然这看起来乍一看是How do I use reflection to call a generic method?的副本,但我并不是简单地试图调用该方法。它被传递给WaitCallback委托。也许这是一个两部分问题:1)如何通过反射检索泛型方法和2)获得方法的句柄,如何将它作为参数传递给WaitCallback委托?

有人有什么想法吗?这甚至可能吗?

3 个答案:

答案 0 :(得分:1)

这是简短的想法

from cvxpy import *
X = Variable(N,T)
G = 100 
d = np.random.randn(1, T)
d *= G-1

X_column_sum = cumsum(X,axis=0)

P = cost_matrix_cars + d


R = matrix([[10]]*N) # all set to 10 for testing


objective = Minimize(sum_entries(X@P)) #think this is good

constraints = [0 <= X, cumsum(X,axis=0) >= R]
prob = Problem(objective, constraints)
print("Optimal value", prob.solve())
print("Optimal X is",x.value ) # A numpy matrix.

如果是实例方法,则应创建类型为var type = Type.GetType(f.TypeName); var methodInfo = typeof(MethodHoderType).GetMethod("MyMethod"); var constructedMethodInfo = methodInfo.MakeGenericMethod(type); constructedMethodInfo.Invoke(...); 的实例以传递给type方法,或者将Invoke作为第一个参数传递给null

查看Type.GetType Method (String)MethodInfo.MakeGenericMethod Method (Type[])了解详情。

答案 1 :(得分:0)

如果您可以从您拥有的字符串创建类型的实例(如果您完全了解它们),则可以使用MethodInfo.MakeGenericMethod(Type[] typeArguments)

看看the docs in MSDN

答案 2 :(得分:0)

希望这有助于。而不是字符串只需构建一个装饰器来接受对项目进行排队的类型。

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
{
}

enter image description here