0

オプションのパラメータを取るメソッドを書きました

public void ExampleMethod(int maxValue = 20)
{
  ...
}

そして私はそれを次のように使用します

int param = GetSomeValue();
ExampleMethod(param < 20 ? param : use_your_default_value_as_specified);

20 未満の場合は param を使用し、それ以外の場合は ExampleMethod に実装されている独自のデフォルト値を使用します (この例では 20 です)。「use_your_default_value_as_specified」をコンパイラに伝えるにはどうすればよいですか?

私はこれを行うことができることを知っています

int param = GetSomeValue();
ExampleMethod(param);

public void ExampleMethod(int maxValue)
{
  if(maxValue > 20)
      maxValue = 20;
}

しかし、ExampleMethodの実行前に正しい値を送信したい

4

6 に答える 6

1

パラメータのデフォルト値を使用するようにコンパイラに指示する唯一の方法は、パラメータをまったく指定しないことです。

実行時に値を取得するために、リフレクションのクラッジェリーを使用できます。

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();
于 2013-10-01T21:41:22.523 に答える
0

最後のステートメントでは、入力時に実際に使用する値をパラメーターに持たせたいと想定していますExampleMethod()。試してみることの 1 つは、その値を計算する別のオブジェクトまたは静的メソッドを作成することです。

class Helper {
    public static int MakeParam(int myParam) {
      return myParam < 20 ? myParam : use_your_default_value_as_specified;
    }
}
...
ExampleMethod(Helper.MakeParam(17));

これにより、メソッドの外部のパラメーターに対して任意のロジックを実行できます。必要に応じて、デフォルト値を渡すことができるバージョンを用意することもできます。

class Helper {
    public static int MakeParam(int myParam) {
      return MakeParam(myParam, use_your_default_value_as_specified);
    }
    public static int MakeParam(int myParam, int myDefault) {
      return myParam < 20 ? myParam : myDefault;
    }
}

次に、名前付きパラメーターを使用して、使用したいものだけに値を提供できます。

void Main()
{
    Console.WriteLine(AddEm(parm3:50)); // = 80
    Console.WriteLine(AddEm(parm2:50)); // = 90
    Console.WriteLine(AddEm());         // = 60)
}

public int AddEm(int parm1 = 10, int parm2 = 20, int parm3 = 30) {
    return parm1 + parm2 + parm3;
}

幸運を!

于 2013-10-01T21:56:40.060 に答える
0

用語チェックを実行し、使用する正しい値を var に割り当てるだけのメソッドを作成できます。(デフォルト値に対して)。次に、6 ~ 7 個の変数をチェックした後、メソッドを呼び出してそれらの変数を提供します。

于 2013-10-01T21:57:36.477 に答える
0

クラスでやってくれませんか?

// Individual Parameter Values 
class ParameterValueClass { 
   double _Value; 
   double _Max; 
   public double Value { get { return (_Value < _Max) ? _Value : _Max }
                         set  { _Value = value; } } 
   public ParameterValueClass(Max) { _Max = Max; } 
 } 
// Set of Parameter Values 
class ParameterSetClass { 
      public ParameterValueClass Parameter1;
      public ParameterValueClass Parameter2;
      public ParameterValueClass Parameter3;
      public ParameterSetClass () { 
          Parameter1 = new ParameterValueClass(20);
          Parameter2 = new ParameterValueClass(4.22314);
          Parameter3 = new ParameterValueClass(700000);
      }
 } 

void ExampleMethod(ParameterSetClass Parameters) {
    /// Parameter1.Value returns the Value or "Max" value. Could also use a min value. 

  }
于 2013-10-01T21:53:30.457 に答える
0

リフレクションはいつでも使用できます。パラメータ コレクションのこのサンプル コードには、デフォルト値を持つパラメータのリストが含まれています。この各パラメーターには、デフォルト値を持つプロパティ DefaultValue があります。

private void Calc(int i, int j, int k = 60, int l = 80)
    {
        var parameters =
            System.Reflection.MethodInfo.GetCurrentMethod().GetParameters().Where(param => param.HasDefaultValue);
      //parameters = {k, l}

    }
于 2013-10-01T21:54:33.630 に答える