【发布时间】:2019-04-21 02:50:40
【问题描述】:
让我们假设以下继承图:
A我不拥有这些类型,也无法控制它们的实现
我们还假设一组静态方法:
句柄(A a)、句柄(B b)、句柄(C c)、句柄(D d)等等。
我当前的 Handle(A a) 实现使用 dynamic 关键字“调度”到所需的方法:
public static void Handle(A a)
{
Handle((dynamic)a);
}
public static void Handle(B b)
{
//B specific processing
}
//And so on
主机应用程序将A[] 中的对象发送给我,尽管每个对象可以有不同的运行时类型。就目前而言,我什至对 A 类型的对象都不感兴趣。
我需要不同的Handle 方法,因为客户想要执行的处理因对象的运行时类型而异。
只要我的代码中有一个 Handle 方法,并且我传入的对象的运行时类型具有相应的签名,我的实现就可以很好地工作,但是就目前而言,当传递一个对象时如果没有特定的Handle 方法,则递归调用Handle(A a) 方法会导致堆栈溢出。
我显然无法为可能从宿主应用程序传递的大约一百种类型中的每一种定义Handle(X x) 方法,并且该宿主应用程序的 API 的每个后续版本都可以定义新类型。
所以我的问题是如何处理没有特定 Handle 方法的类型,而不必执行一系列无休止的 if 语句,甚至是长长的 switch 语句,以过滤我要处理的对象没有处理方法?
有什么方法可以在运行时确定传入对象的运行时类型是否确实存在Handle 方法?还是有其他方法可以干净地处理“丢失”的方法?
欢迎任何见解/建议。
【问题讨论】:
-
使用单独的方法进行动态调度,让
Handle(A a)只处理不存在更具体的Handle的情况。 -
@PetSerAl,嗯,这正是我要问的:在运行时,我怎么知道不存在更具体的方法?否则,
Handle(A a)称自己为“ad infinitum”
标签: c# dynamic dynamic-languages