在 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);
我正在尝试设计一个 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);