在设置之后,我有几个通用函数,我需要在运行时选择由两个字符串标识的类型和函数。
我的第一次尝试看起来像这样:
public static class FOOBAR
{
public delegate void MyDelegateType(int param);
public static void foo<T>(int param){...}
public static void bar<T>(int param){...}
public static void someMethod(string methodstr, string typestr)
{
MyDelegateType mydel;
Type mytype;
switch(typestr)
{
case "int": mytype = typeof(int);
break;
case "double": mytype = typeof(double);
break;
default: throw new InvalidTypeException(typestr);
}
switch(methodstr)
{
case "foo": mydel = foo<mytype>; //error
break;
case "bar": mydel = bar<mytype>; //error
break;
default: throw new InvalidTypeException(methodstr);
}
for(int i=0; i<1000; ++i)
mydel(i);
}
}
因为这不起作用,我嵌套了那些开关(typestr开关内的methodstr开关或反之亦然),但这个解决方案真的很丑陋且不可维护。
类型的数量几乎是固定的,但foo
或bar
等函数的数量会增加很多,所以我不想要嵌套切换。
那么如何在不使用嵌套开关的情况下实现此功能呢?
答案 0 :(得分:4)
您需要使用Reflection:
MethodInfo method = typeof(FooBar).GetMethod(methodStr, BindingFlags.Static);
Type genericParam = Type.Parse(typestr);
MethodInfo genericMethod = method.MakeGenericMethod(genericParam);
for(int i=0; i<1000; ++i)
genericMethod.Invoke(null, new object[] { i });
如果方法的(非泛型)签名总是相同的,那么创建委托会更快,如下所示:
Action<int> del = Delegate.CreateDelegate(typeof(Action<int>), null, genericMethod);
for(int i=0; i<1000; ++i)
del(i);
答案 1 :(得分:0)