在运行时指定通用委托类型参数

时间:2010-05-13 12:24:08

标签: c# generics delegates

在设置之后,我有几个通用函数,我需要在运行时选择由两个字符串标识的类型和函数。

我的第一次尝试看起来像这样:

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开关或反之亦然),但这个解决方案真的很丑陋且不可维护。

类型的数量几乎是固定的,但foobar等函数的数量会增加很多,所以我不想要嵌套切换。

那么如何在不使用嵌套开关的情况下实现此功能呢?

2 个答案:

答案 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)

查看Delegate.CreateDelegate

的文档