我有一些丑陋的代码看起来像这样:
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委托?
有人有什么想法吗?这甚至可能吗?
答案 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)
答案 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
{
}