Передал созданный экземпляр System.Type в качестве параметра типа для универсального метода - PullRequest
0 голосов
/ 06 октября 2010

У меня есть фрагмент кода, который я хочу упростить:

        switch (typeString)
        {
            case "boolean":
                CreateSimpleRows<bool>(ref group, value);
                break;
            case "datetime":
                CreateSimpleRows<DateTime>(ref group, value);
                break;
            case "double":
                CreateSimpleRows<double>(ref group, value);
                break;
            case "int32":
                CreateSimpleRows<int>(ref group, value);
                break;
            case "int64":
                CreateSimpleRows<long>(ref group, value);
                break;
            case "string":
                CreateSimpleRows<string>(ref group, value);
                break;
        }

Метод объявлен как CreateSimpleRows<T>. Я попытался передать экземпляр System.Type, но это не сработало.

Я наткнулся на этот ответ на похожий вопрос: Передать экземпляр системы. Тип в качестве параметра типа для общего класса

Я проверил и увидел, что в классе MethodInfo есть MakeGenericMethod. Дело в том, что я не знаю, как преобразовать «CreateSimpleRows» в экземпляр MethodInfo.

Возможно ли то, что я думаю о достижении, даже возможно? Заранее спасибо за ответы.

1 Ответ

3 голосов
/ 06 октября 2010

Чтобы получить MethodInfo, вы звоните Type.GetMethod:

MethodInfo method = typeof(TypeContainingMethod).GetMethod("CreateSimpleRows");
MethodInfo generic = method.MakeGenericMethod(typeArgument);

Обратите внимание, что если вы хотите получить закрытый метод, вам нужно использоватьперегрузка GetMethod, которая также принимает BindingFlags.

Хотя не совсем понятно, почему вы хотите сделать это с помощью отражения.Хотя ваш текущий фрагмент повторяется, его, по крайней мере, легко понять.Использование отражения может сделать вещи более подверженными ошибкам, и вам все равно придется сопоставить typeString с Type для начала.

...