2011-08-17 49 views
3

我知道我可以聲明具有默認常量參數如代表:C#代表與不同的可選參數的方法

delegate void MyDelegate(int x, int y = 5); 

,然後與簽名匹配的任何方法,任何地方調用它。

好吧,我已經有了一個聲明如下方式方法等:

public Something FirstMethod(float val = 10, int skip = 0){ ... return sth; } 
public Something SecondMethod(float val = 20, int skip = 0){ ... return sth; } 
public Something ThirdMethod(float val = 5, int skip = 0){ ... return sth; } 

...這個例子不勝枚舉一路下來,反正它們都有簽名結構。這裏的要點是,它們都有浮點參數,默認是不同的。

然後,我想創建一個委託,它會指向這些方法之一:

delegate Something ProblematicDelegateType(<<WHAT WILL GO HERE>>); 
ProblematicDelegateType myFunc; 
if(someValue == someParameter){ 
    myFunc = FirstMethod; 
}else if(...){ 
    myFunc = SecondMethod; 
}else... 
... 
} 

myFunc(); 
myFunc(skip:100); 

我希望能夠調用myFunc兩參或與skip參數。在這部分代碼中,第一個參數val未被使用。 (他們在其他地方使用)。

什麼會去代表的參數列表?我想保留該方法的默認val參數,不管它是什麼。

回答

3

如果我理解正確,您的myFunc將完全忽略val參數,對於最終調用的方法,始終使用默認值,對嗎?

如果是的話,這應該做到你在找什麼:

delegate Something ProblematicDelegateType(int skip = 0); 
ProblematicDelegateType myFunc; 
if (someValue == someParameter) { 
    myFunc = skip => FirstMethod(skip: skip); 
} else if (...) { 
    myFunc = skip => SecondMethod(skip: skip); 
} else ... 
    ... 
} 
+0

那一個能工作,但有沒有更好,更正式/模塊化的方法呢?我正在尋找一些我不添加'skip => Method(skip:skip);'並且能夠'不知何故'直接調用myFunc指向的方法,而無需包裝另一個lambda。當然,如果這是可能的:) –

+0

@canpoyrazoğlu:這是不可能的。如果你想使用一些默認參數,那麼方法'FirstMethod','SecondMethod'等必須被調用_explicitly_,因爲只有在那些調用位置是編譯器插入的默認參數。所以唯一的辦法就是圍繞他們環繞 – JBSnorro

+0

好的,我會繼續打包。但仍然不知道爲什麼它不能完成,因爲簽名是'硬編碼'的,沒有泛型或任何類型的任何類型的變體,並且如果編譯器知道參數的確切順序和類型,邏輯上應該是一種方式進入那個。但我仍然會使用包裝。 –

1

使用lambda到你想要的值綁定。默認值是有效的重載,它們將你想要的值綁定到函數參數。既然你有各種各樣的if分離出這些函數,只需將一個委託傳遞給一個只需要一個整數的函數即可。

換句話說,

delegate Something ProblematicDelegateType(int skip = 0) 

//... 

ProblematicDelegateType myDelegate; 
if (someCondition) 
    myDelegate = (_1) => FirstMethod(10, _1); 
else if (someOtherCondition) 
    myDelegate = (_1) => SecondMethod(20, _1); 

等..

+0

問題是我不想觸摸我調用的方法的另一個參數(第一個參數)。 –

1

你的要求,即委託具有取決於它調用無法做到的方法有多種可選參數。可選參數通過在編譯時重寫方法的調用位置來實現。如果代理指向的方法在運行時確定,它將在編譯時編寫什麼? Eric Lippert的optional arguments系列非常有啓發性。

但是,您也可以考慮使用反射來獲取默認值。使用MethodInfo.GetParameters()獲取參數info並獲取默認值ParameterInfo.DefaultValue

+0

我現在看到..但我不想進入反思,我只是去與包裝解決方案。 –