告诉编译器使用参数的默认值的唯一方法是根本不指定它。
您可以使用一些反射 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 作为 a 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();