簡體   English   中英

如何避免多次重復使用接受Func的方法 <T, int> 作為參數

[英]How to avoid repetition with multiple overrides of method accepting Func<T, int> as parameters

我希望有一個“泛型”-即,如果可能的話,具有單個簽名的方法-而不是下面的此復制/粘貼代碼。

我的目標是使用間諜Double從第三方DLL中“包裝”方法

    int spy(Func<int> method)
    {
        methodCalls.Add(method.Method.Name);

        return method.Invoke();
    }

    int spy(Func<string, int> method, string arg)
    {
        methodCalls.Add(method.Method.Name);

        return method.Invoke(arg);
    }

    private int spy(Func<int, int> method, int arg)
    {
        methodCalls.Add(method.Method.Name);

        return method.Invoke(arg);
    }

您會看到問題:我的方法塊幾乎相同...有沒有辦法避免這種情況並仍然實現所需的行為?

好吧,您可以先將它們設為通用:

public TResult Spy<TResult>(Func<TResult> method)
{
    methodCalls.Add(method.Method.Name);
    return method();
}

public TResult Spy<TArg, TResult>(Func<TArg, TResult> method, TArg arg)
{
    methodCalls.Add(method.Method.Name);
    return method(arg);
}

public TResult Spy<TArg1, TArg2, TResult>
    (Func<TArg1, TArg2, TResult> method, TArg1 arg1, TArg2 arg2)
{
    methodCalls.Add(method.Method.Name);
    return method(arg1, arg2);
}

...

至少這意味着您只需要與要處理的最大參數數量一樣多的重載。 在不失去編譯時類型安全性的情況下,您將無法輕松地做得更好。

首先,您需要要監視的FuncAction委托的通用方法。 您需要這些方法來獲得漂亮的強類型API。 您還需要一個私有的通用方法,該方法接受一個Delegate和一個參數列表。 此方法將進行調用和記錄:

public TResult Spy<TResult> (Func<TResult> method)
{
    return Spy<TResult>((Delegate)method);
}

public TResult Spy<T1, TResult> (Func<T1, TResult> method, T1 arg1)
{
    return Spy<TResult>((Delegate)method, arg1);
}

private TResult Spy<TResult> (Delegate method, params object[] args)
{
    methodCalls.Add(method.Method.Name);
    return (TResult)method.Method.Invoke(method.Target, args);
}

現在,您可以傳遞帶有零或一個參數的任何方法,執行它們並記錄方法名稱,而無需任何重復。

根據您的主要目標

具有“泛型”-即,如果可能的話,具有單個簽名的方法,而不是下面的此復制/粘貼代碼。

您可以嘗試關注

object SpyUniversal(Delegate method, object[] args) 
{ 
  methodCalls.Add(method.Method.Name); 
  return method.Method.Invoke(null, args); 
}

請注意,您正在失去提到的編譯時類型安全。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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