Не удается преобразовать из «typeA» в «typeB» при попытке динамического связывания в C # - PullRequest
0 голосов
/ 06 мая 2019

Я пытаюсь разработать API, который должен иметь определенный метод для каждого из 20+ конкретных классов, которые мне нужно поддерживать (я не могу изменить эти спецификации).

Моя первая идея состояла в том, чтобы использовать перегрузку, чтобы иметь один и тот же метод с разными параметрами и иметь возможность автоматически вызывать правильный метод, основанный на конкретном классе, однако я получаю сообщение об ошибке в заголовке, и мне интересно, было ли лучший способ сделать это (без необходимости использовать if / тип объекта).

Вот быстрый псевдокод пример:

class BaseClass {}
class ChildClassA : BaseClass {}
class ChildClassB : BaseClass {}

class Factory {

    public static void Build(ChildClassA obj){}
    public static void Build(ChildClassB obj){}

}

class Main {

    public static void Main(string[] args){
        BaseClass obj = getFromSomewhereRemote();
        Factory.Build(obj); // This is the line where I get the error
    }

}

Я понимаю, что мог бы создать такой метод:

void Build(BaseClass obj){

    switch (obj){
        case BaseClassA objA:
            Build(objA);
            break;
        ....
    }

}

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

1 Ответ

2 голосов
/ 06 мая 2019

Хотя это и не рекомендуется, но вы можете сделать что-то подобное с ключевым словом dynamic. Dynamic использует отражение под капотом, поэтому возникает проблема с производительностью. Это позволит избежать много утверждений, если. Время выполнения решит, какой метод займет.

 void Build(ChildClassA obj)
 {
     obj.MethodA();
 }

 void Build(ChildClassB obj)
 {
     obj.MethodB();
 }

И звоните:

Build((dynamic) baseClassObj);
...