執行之前發送正確的值告訴編譯使用默認值的唯一途徑參數不是完全指定它。
你可以使用一些反射kludgery在運行時獲得的價值:
public static object DefaultValueForParameter(Type type, string methodName, int parameterNumber)
{
return type.GetMethod(methodName).GetParameters()[parameterNumber].DefaultValue;
}
ExampleMethod(param < 20 ? param : (int)DefaultValueForParameter(this.GetType(), "ExampleMethod", 0));
但是,這不是很優雅和高效。
您可以重構ExampleMethod
採取爲空的參數,而不是像這樣:
public void ExampleMethod(int? maxValue = null)
{
if(maxValue.HasValue)
maxValue = 20;
}
ExampleMethod(param < 20 ? (int?)param : null);
這樣,在實際默認值的函數中隱藏。本身,我知道這看起來很像你說你不想使用的代碼,但有一個關鍵的區別。它將可以傳入的值的邏輯與默認值應該是什麼分開。在你說你不想使用的解決方案中,不可能將10作爲maxValue
,因爲它會在你的方法中被覆蓋。
你也可以重構這使得默認值是一個公開的常量,像這樣:
const int DefaultMaxValue = 20;
public void ExampleMethod(int? maxValue = DefaultMaxValue)
{
maxValue.Dump();
}
ExampleMethod(param < 20 ? param : DefaultMaxValue);
這樣一來,你有,你可以在多個地方使用默認值的好處你的代碼無需每次都指定它。
不過,如果你不喜歡上面的任何解決方案,你可以堅持最簡單的方法。我知道這不是正是你要找的,但我可能會與此去:
if (param < 20)
ExampleMethod(param)
else
ExampleMethod();
還要注意的是,如果ExampleMethod
返回之外的東西比void
,你可以這樣做:
var result = param < 20 ? ExampleMethod(param) : ExampleMethod();
其實在我的項目有6-7可選參數。所以我不能像這樣使用它 – Melih
@Melih:這是一個大問題,應該是在問題。 –
其實根據我的問題,我需要知道我是否可以對編譯器說「使用方法中指定的任何默認值」 – Melih