簡體   English   中英

具有不同返回類型和參數數量的Func委托列表

[英]List of Func delegates with varying return types and number of parameters

我有一堂課,需要在構造函數中傳遞不同數量的Func委托。 這些委托中的每一個都指向一個不同的函數,每個函數具有不同的返回類型和不同數量的參數(double類型)。 然后將分別調用這些函數中的每一個。

問題1.現在,為了使使用該類的人員更輕松,我正在考慮允許用戶傳遞Func委托的List<object> 這是否可能,如果可以,我是否可以確定將List<object>傳遞給的方法(即構造函數)中每個Func所需的返回類型和參數數量?

問題2。如果以上方法不可行,我是否需要使用返回類型/參數數量的每種不同組合來重載構造函數,並相應地路由每個Func -_- ... ...如果沒有人可以向我指出正確的方向,我覺得我正在以錯誤的方式來解決這個問題...

注意-來自python背景,我會做這樣的事情(我在c#中沒有經驗):

import inspect
def test(x): return x
inspect.getargspec(test)

returns: ArgSpec(args=['x'], varargs=None, keywords=None, defaults=None)

非常感謝

問題1.現在,為了使使用該類的人員更輕松,我正在考慮允許用戶傳遞Func委托列表。 這是否可能,如果可以,我是否可以確定將List傳遞給的方法(即構造函數)中每個Func所需的返回類型和參數數量?

並不是的。 您可以允許使用List<Delegate> (或其他元素類型為Delegate其他集合),但不能使用Func特定的Func ,這有兩個原因:

  • Func實際上是類型 ,具有不同數量的泛型類型參數。 就CLR而言,這些類型是完全分開的。 Func<TResult>Func<T, TResult>Action<T>EventHandler

  • 即使您只處理同一泛型類型的委托的多個值,它們可能具有不同的類型參數這一事實也意味着它們與CLR的類型不同; 對於“可能具有不同類型參數的函數列表”,無法說出List<Func<>> 再次,CLR將它們視為單獨的類型-盡管這次至少有一個具有通用的泛型類型定義。

問題2。如果上述方法不可行,我是否需要使用返回類型/參數數量的每種不同組合來重載構造函數,並相應地路由每個Func

好吧,有幾種選擇:

  • 將所有參數設置為可選,為每個參數提供默認值null ,然后在調用構造函數時使用命名參數:

      var foo = new Foo(clickHandler: () => ..., keyHandler: key => ...); 
  • 創建一個生成器,以便可以將各種功能設置為屬性-這與對象初始化器語法非常匹配:

      var foo = new Foo.Builder { ClickHandler = () => ..., KeyHandler = () => ... }.Build(); 

當然,后兩種解決方案都取決於您確實具有特定的命名目的。

如果您可以更清楚地了解要實現的目標,這將有所幫助-正如dtb所說,多態可能更適合此處。 您可以使用虛擬方法的無操作實現創建一個抽象類,並且實現可以選擇要覆蓋的類。

暫無
暫無

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

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