[英]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);
}
...
至少這意味着您只需要與要處理的最大參數數量一樣多的重載。 在不失去編譯時類型安全性的情況下,您將無法輕松地做得更好。
首先,您需要要監視的Func
和Action
委托的通用方法。 您需要這些方法來獲得漂亮的強類型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.