Преобразовать строку в тип и передать делегату generi c? - PullRequest
0 голосов
/ 08 мая 2020

Я уже некоторое время ломаю голову над этим, и я уверен, что есть элегантное решение ... Кажется, я просто не могу его найти.

У меня есть веб-API, в котором тип объекта действие устанавливается строковым параметром. Затем мне нужно вызвать несколько общих c методов на основе этого типа. В основном у меня есть старый добрый оператор switch, который мне грозит повторить несколько раз, поэтому я хочу попытаться инкапсулировать его в методе многократного использования:

switch (ModuleName)
            {
                case "contacts":
                    return Method1<Contact>();
                case "accounts":
                    return Method1<Account>();
                default:
                    throw new Exception("ModuleName could not be resolved");
            }

В других местах я ' Мне нужно будет сделать то же самое, но вызвать Method2, Method3, Method4 et c.

Я думаю, я смогу превратить это в метод, который принимает строку и делегат, который принимает общие c type, но я застрял в том, как это построить. Может ли кто-нибудь указать мне в правильном направлении?

Большое спасибо

Тим

1 Ответ

0 голосов
/ 08 мая 2020

Как говорит Майкл Рэндалл, дженерики должны быть известны во время компиляции. Я думаю, вам нужно пересмотреть, как вы инкапсулируете здесь свой бизнес logi c. Вероятно, вы могли бы решить это так:

class Example{

    void Main(){

        var method1 = new LogicMethod1();
        TestCase("contacts", method1);
        TestCase("Case2", method1);

        var method2 = new LogicMethod2();
        TestCase("contacts", method2);
        TestCase("Case2", method2);
    }

    void TestCase(string moduleName, LogicBase logic){


        switch(moduleName){
            case "contacts" : logic.DoTheStuff<Contact>(); break;
            case "accounts" : logic.DoTheStuff<Account>(); break;
        }
    }
}

abstract class LogicBase{
    public abstract void DoTheStuff<T>();
}

class LogicMethod1 : LogicBase{
    public override void DoTheStuff<T>(){
        //Logic for your Method1
    }
}

class LogicMethod2 : LogicBase{
    public override void DoTheStuff<T>(){
        //Logic for your Method2
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...