在 C# 中尝试动态绑定时无法从 'typeA' 转换为 'typeB'

Cannot convert from 'typeA' to 'typeB' when attempting dynamic binding in C#

我正在尝试设计一个 API,它应该为我需要支持的 20 多个具体 class 中的每一个都有特定的方法(我无法更改那些规格)。

我的第一个想法是使用重载来获得具有不同参数的相同方法,并能够根据具体内容自动调用正确的方法 class,但是我在标题和我想知道是否有更好的方法来做到这一点(不必在 object 的类型上使用 if/switch)。

这是一个简单的 pseudo-code 示例:

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

}

但我想知道是否可以在不切换类型的情况下获得相同的结果。

虽然不推荐,但是你可以用 dynamic 关键字做这样的事情。动态在引擎盖下使用反射,因此存在性能问题。这将避免很多 if 语句。运行时将决定采用哪种方法。

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

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

然后调用:

Build((dynamic) baseClassObj);