簡體   English   中英

從基礎調用派生類函數的實現

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM