使用动态时的方法解析和处理特定派生的未定义方法 class
Method resolution when using dynamic and handling of undefined method for specific derived class
让我们假设以下继承图:
A<-B<-C<-D<-E<-...(继承树其实比这个例子更复杂,它包含了数百种实际类型)。 我不拥有这些类型,也无法控制它们的实现
我们还假设一组静态方法:
句柄(A a)、句柄(B b)、句柄(C c)、句柄(D d)等。
我当前通过使用 dynamic
关键字将 Handle(A a) "dispatches" 实现为所需的方法:
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
方法?还是有其他方法可以干净地处理 "missing" 方法?
任何 insight/recommendations 欢迎。
我不记得我是从哪里得到在 Handle(A a)
内调度的想法的。我记得在某个网站上看到过类似的东西,但我现在意识到它一定适用于与我想要实现的不同的用例。
我通过简单地将强制转换 (dynamic)obj
移到 "Handling" 方法之外并返回到调用者来解决我的问题:
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)
方法,不执行任何操作。
让我们假设以下继承图:
A<-B<-C<-D<-E<-...(继承树其实比这个例子更复杂,它包含了数百种实际类型)。 我不拥有这些类型,也无法控制它们的实现
我们还假设一组静态方法:
句柄(A a)、句柄(B b)、句柄(C c)、句柄(D d)等。
我当前通过使用 dynamic
关键字将 Handle(A a) "dispatches" 实现为所需的方法:
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
方法?还是有其他方法可以干净地处理 "missing" 方法?
任何 insight/recommendations 欢迎。
我不记得我是从哪里得到在 Handle(A a)
内调度的想法的。我记得在某个网站上看到过类似的东西,但我现在意识到它一定适用于与我想要实现的不同的用例。
我通过简单地将强制转换 (dynamic)obj
移到 "Handling" 方法之外并返回到调用者来解决我的问题:
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)
方法,不执行任何操作。