Указание универсального параметра типа делегата во время выполнения - PullRequest
1 голос
/ 13 мая 2010

после настройки у меня есть несколько общих функций, и мне нужно выбрать тип и функцию, определенные двумя строками во время выполнения.

моя первая попытка выглядела так:

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

, так как это не сработало, я вложил эти переключатели (переключатель methodstr внутри переключателя typestr или наоборот), но это решение действительно некрасиво и не поддерживается.

Количество типов в значительной степени фиксировано, но количество функций, таких как foo или bar, будет увеличиваться на большие числа, поэтому я не хочу вложенных переключателей.

Так, как я могу заставить это работать без использования вложенных переключателей?

Ответы [ 2 ]

4 голосов
/ 13 мая 2010

Вам нужно использовать 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);
0 голосов
/ 13 мая 2010

Посмотрите документацию для Delegate.CreateDelegate

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...