パラメータのデフォルト値を使用するようにコンパイラに指示する唯一の方法は、パラメータをまったく指定しないことです。
実行時に値を取得するために、リフレクションのクラッジェリーを使用できます。
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
次のように、代わりに null 許容引数を取るようにリファクタリングできます。
public void ExampleMethod(int? maxValue = null)
{
if(maxValue.HasValue)
maxValue = 20;
}
ExampleMethod(param < 20 ? (int?)param : null);
このようにして、実際のデフォルト値は関数内に隠されます。それ自体、これはあなたが使いたくないと言ったコードによく似ていることを私は知っています。重要な違いがあります。デフォルト値がどうあるべきかから、どの値を渡すことができるかのロジックを分離します。使用したくないと述べたソリューションではmaxValue
、メソッド内でオーバーライドされるため、 10 を として使用することは不可能です。
次のように、デフォルト値が公開されている定数になるように、これをリファクタリングすることもできます。
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();