【问题标题】:Method resolution when using dynamic and handling of undefined method for specific derived class对特定派生类使用动态和处理未定义方法时的方法解析
【发布时间】: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


【解决方案1】:

我不记得在Handle(A a) 中调度的想法是从哪里得到的。我记得在某个网站上看到过类似的东西,但我现在意识到它一定适用于与我试图实现的不同的用例。

我解决了我的问题,只需将演员 (dynamic)obj 移到“处理”方法之外,然后回到调用者身上:

 Logger.Handle((dynamic)obj);

在我的实现中,层次结构基础的方法现在只是一个空方法:

 public class Logger
 {
      public static void Handle(A a){}

      public static void Handle(B b)
      {
           //B specific handling
      }

      //All other Handle methods
 }

这解决了问题。如果派生类型不存在特定方法,则调用Handle(A a) 方法,什么也不做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    • 2010-09-22
    • 1970-01-01
    相关资源
    最近更新 更多