注:この質問は、C#がまだオプションのパラメータをサポートしていなかった頃(つまりC#4以前)に行われたものです。</sup>
C#のクラスからプログラムで生成されるWeb APIを構築しています。クラスにはGetFooBar(int a, int b)
というメソッドがあり、APIには&a=foo &b=bar
のようなクエリパラメータを受け取るGetFooBar
というメソッドがあります。
クラスはオプションのパラメータをサポートする必要がありますが,C#言語ではサポートされていません。どうすればいいでしょうか?
C#では通常、複数の形式のメソッドを使用します。
void GetFooBar(int a) { int defaultBValue; GetFooBar(a, defaultBValue); }
void GetFooBar(int a, int b)
{
// whatever here
}
UPDATE: 上記の方法は、C# 2.0でデフォルト値を扱う方法でした。 現在取り組んでいるプロジェクトではC# 4.0を使用しており、オプションのパラメータが直接サポートされています。 以下は、私が自分のコードで使用した例です。
public EDIDocument ApplyEDIEnvelop(EDIVanInfo sender,
EDIVanInfo receiver,
EDIDocumentInfo info,
EDIDocumentType type
= new EDIDocumentType(EDIDocTypes.X12_814),
bool Production = false)
{
// My code is here
}
このサイトから
http://www.tek-tips.com/viewthread.cfm?qid=1500861&page=1
C#では、[Optional]属性を使用することができます(VBのものですが、C#では機能していません)。そのため、次のようなメソッドを持つことができます。
using System.Runtime.InteropServices;
public void Foo(int a, int b, [Optional] int c)
{
...
}
APIラッパーでは、オプションのパラメータを検出して(ParameterInfo p.IsOptional)、デフォルト値を設定しています。目標は、パラメータ名に "optional"を付けるような不細工な方法に頼らずに、パラメータをオプションとしてマークすることです。
メソッドのオーバーロードを使えば...。
といった感じです。 GetFooBar() GetFooBar(int a) GetFooBar(int a, int b)
メソッドのシグネチャによりますが、私が挙げた例では、"int b"だけのメソッドは、"int a"のメソッドと同じシグネチャになるので、足りません。
Nullable型を使うこともできますが...。
となります。 GetFooBar(int? a, int? b)
その後、a.HasValueを使って、パラメータが設定されているかどうかをチェックすることができます。
他にも、 'params'というパラメータを使う方法もあります。
GetFooBar(params オブジェクト[] args)
名前付きパラメータを使用したい場合は、それを扱う型を作成する必要がありますが、Webアプリ用にこのようなものがすでにあると思います。