注意:这个问题是在C#还不支持可选参数的时候提出的(即在C#4之前)。</sup>。
我们正在构建一个网络API,它是由C#类编程生成的。这个类有方法GetFooBar(int a, int b)
,API有方法GetFooBar
,接受查询参数如&a=foo &b=bar
。
该类需要支持可选参数,而C#语言不支持。最好的方法是什么?
在C#中,我通常会使用该方法的多种形式。
void GetFooBar(int a) { int defaultBValue; GetFooBar(a, defaultBValue); }
void GetFooBar(int a, int b)
{
// whatever here
}
更新:上面提到的是我用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)并设置一个默认值。我们的目标是将参数标记为可选参数,而不需要使用诸如在参数名称中加入"可选"这样的笨办法。
你可以使用方法重载...
GetFooBar() GetFooBar(int a) GetFooBar(int a, int b)
这取决于方法的签名,我给出的例子中缺少只有"int b"的方法,因为它的签名与"int a"方法相同。
你可以使用Nullable类型...
GetFooBar(int? a, int? b)
然后你可以使用a.HasValue检查,看看是否已经设置了一个参数。
另一个选择是使用'params'参数。
GetFooBar(params object[] args)
如果你想使用命名的参数,将需要创建一个类型来处理它们,尽管我认为已经有类似的东西用于网络应用。