6

2つの固定引数を持つ1つの関数があります。しかし、次の引数は固定されていません。2つまたは3つまたは4つの引数が存在する可能性があります。

これは実行時の引数なので、どうすればその関数を定義できますか?

私のコードは次のようになります:

public ObservableCollection<ERCErrors> ErrorCollectionWithValue
    (string ErrorDode, int MulCopyNo, dynamic arguments comming it should be 2 or 3)
        {

        return null;
    }
4

3 に答える 3

12

1)params(C#リファレンス)

public ObservableCollection<ERCErrors>ErrorCollectionWithValue
                (string ErrorDode, int MulCopyNo, params object[] args)
{
    //...
}

2)名前付きおよびオプションの引数(C#プログラミングガイド)

public ObservableCollection<ERCErrors> ErrorCollectionWithValue
    (string ErrorDode, int MulCopyNo, object arg1 = null, int arg2 = int.MinValue)
{
    //...
}

3)そして、おそらく単純なメソッドのオーバーロードは、メソッドロジックを異なるメソッドに分離する方が適しているでしょうか?このリンクの下には、名前付きパラメーターとオプションのパラメーターの別の説明もあります。

于 2012-09-25T07:28:21.553 に答える
5

1つのアプローチは、メソッドをオーバーロードすることです

public ObservableCollection<ERCErrors> ErrorCollectionWithValue
    (string ErrorDode, int MulCopyNo, int param1)
{
   //do some thing with param1
}

public ObservableCollection<ERCErrors> ErrorCollectionWithValue
    (string ErrorDode, int MulCopyNo, int param1,int param2)
{
   //do some thing with param1 and param3
}

public ObservableCollection<ERCErrors> ErrorCollectionWithValue
    (string ErrorDode, int MulCopyNo, int param1, int param2, int param3)
    {
       //do some thing with param1, param2 and param3
    }

その後、これらすべてが有効になります

var err = ErrorCollectionWithValue("text", 10, 1);
var err = ErrorCollectionWithValue("text", 10, 1,2);
var err = ErrorCollectionWithValue("text", 10, 1,2,3);

別のアプローチは、オプションのパラメーターを使用することです。これを使用すると、最初のアプローチの3つとは対照的に、1つの方法のみが必要になります。

public ObservableCollection<ERCErrors> ErrorCollectionWithValue
    (string ErrorDode, int MulCopyNo, int param1 = 0, int param2 = 0, optional int param3 = 0)
{

}

これらはまだ有効です

var err = ErrorCollectionWithValue("text", 10, 1); //defaults param2 and param3 to 0
var err = ErrorCollectionWithValue("text", 10, 1,2); //defaults param3 to 0
var err = ErrorCollectionWithValue("text", 10, 1,2,3);

オプションのパラメーターをスキップするには、名前付きパラメーターを使用する必要があります。これは、C#4.0以降でのみサポートされています。

var err = ErrorCollectionWithValue("text", param3: 5); //skipping param1 and param2

他の2つのアプローチでは、パラメーターの順序をスキップすることはできません。

于 2012-09-25T07:19:04.220 に答える
2

引数の数が異なる場合は、paramsを使用できます。

public ObservableCollection<ERCErrors> ErrorCollectionWithValue(string errorCode, int num, params object[] args) 
{ 
  foreach(object obj in args)
{
  //process args.
}
}
于 2012-09-25T07:29:32.863 に答える