[英]Call derived class function implementation from base
我們有以下情況:
public interface IHandle<T> {
void Handler(T param);
}
public abstract class AbsBase : IWasLeftOutForBrevity {
public void SomeFunction<T>(T param) {
// ... see question ...
}
}
public class Derived : AbsBase, IHandle<int>, IHandle<decimal> {
public void Handler(int param) {
// ...
}
public void Handler(decimal param) {
// ...
}
}
在上面的代碼中,這可能是一段很好看的代碼,由此派生類實現給定特定類型的許多句柄函數。
我們有一個通用的IoC容器,該容器注入IWasLeftOutForBrevity
實例,並以給定類型在抽象基類上通用調用SomeFunction
。 SomeFunction
旨在在Derived
類上調用關聯的Handler
函數,作為其操作的一部分。
鑒於基本接口是IWasLeftOutForBrevity
,並且我們在通用基礎結構中使用了此接口,因此我們無法直接訪問Handler
方法。
我們通常會做類似的事情:
GetType().InvokeMember("Handler",
BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.InvokeMethod,
null,
this,
args
);
或類似的GetType().GetMethods("Handler", ...)
/ GetType().GetMethod("Handler", ...)
來查找要在實例上調用的方法。
增加的“復雜性”是IHandle
使用的類型通常是公共接口的實現。
我想知道是否有更干凈的方式訪問Handler
方法而不進行這種類型的反射(例如,嘗試擺脫魔術的“ Handler”字符串),這種類型更安全嗎?
我們無法使用this is IHandle<T> handle
選項( this is IHandle<T> handle
)。 有一個使用通用頂級接口傳遞數據的流程。 然后,使用頂級接口調用AbsBase.SomeFunction
,並且由於派生類未實現頂級接口,因此轉換中斷。
即
public interface IDataAbstraction { }
public class SomeFunctionalHandle : IDataAbstraction { }
public class Derived : AbsBase, IHandle<SomeFunctionalHandle>{
public void Handler(SomeFunctionalHandle param) {
// ...
}
}
// later in a decorator
IWasLeftOutForBrevity instance = getInstance(); // get instance of derived
IDataAbstraction data = getData(); // get data based on IDataAbstraction
instance.SomeFunction(data);
在通用服務基礎結構中,代碼繞過IDataAbstraction
,然后將其傳遞給SomeFunction
。
我可能會這樣做:
public abstract class AbsBase
{
public void SomeFunction<T>(T param)
{
if (this is IHandle<T> handle)
{
handle.Handler(param);
}
else
{
// Handle error case
}
}
}
在達到這個目標之前,我使用反射和編譯表達式使用了其他方法。 我認為它們都不如上面的代碼,因此我沒有將它們包括在我的答案中,但是如果您感興趣的話,它們也位於編輯歷史記錄中。
編輯:啊,原來@HimBromBeere首先在評論中建議了這個,而我仍在嘗試反射。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.