注意:这个问题是在c#还不支持可选参数的时候提出的(即在c# 4之前)。
我们正在构建一个web API,它是从c#类中编程生成的。该类有方法GetFooBar(int a, int b), API有方法GetFooBar接受查询参数,如&a=foo &b=bar。
类需要支持可选参数,而c#语言不支持这一点。最好的方法是什么?
注意:这个问题是在c#还不支持可选参数的时候提出的(即在c# 4之前)。
我们正在构建一个web API,它是从c#类中编程生成的。该类有方法GetFooBar(int a, int b), API有方法GetFooBar接受查询参数,如&a=foo &b=bar。
类需要支持可选参数,而c#语言不支持这一点。最好的方法是什么?
当前回答
另一种选择是使用params关键字
public void DoSomething(params object[] theObjects)
{
foreach(object o in theObjects)
{
// Something with the Objects…
}
}
叫喜欢……
DoSomething(this, that, theOther);
其他回答
你可以重载你的方法。一个方法包含一个参数GetFooBar(int a),另一个包含两个参数GetFooBar(int a, int b)
在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
}
而不是默认参数,为什么不直接从传入的querystring构造一个字典类..一个几乎与asp.net表单处理查询字符串的方式相同的实现。
即请求。查询字符串(“a”)
这将使叶子类与工厂/样板代码解耦。
您可能还想使用ASP.NET检查Web服务。Web服务是通过c#类的属性自动生成的Web api。
从这个网站:
https://www.tek-tips.com/viewthread.cfm?qid=1500861
c#确实允许使用[Optional]属性(来自VB,但在c#中没有功能)。你可以有一个这样的方法:
using System.Runtime.InteropServices;
public void Foo(int a, int b, [Optional] int c)
{
...
}
在我们的API包装器中,我们检测可选参数(ParameterInfo p.s isoptional)并设置默认值。我们的目标是将参数标记为可选的,而不是在参数名称中使用“optional”。
对于大量的可选参数,可以使用ContainsKey方法使用Dictionary<string,Object>的单个参数。我喜欢这种方法,因为它允许我单独传递List<T>或T,而不必创建一个完整的其他方法(例如,如果参数要用作过滤器,那就很好了)。
示例(如果不需要可选参数,则传递new Dictionary<string,Object>()):
public bool Method(string ParamA, Dictionary<string,Object> AddlParams) {
if(ParamA == "Alpha" && (AddlParams.ContainsKey("foo") || AddlParams.ContainsKey("bar"))) {
return true;
} else {
return false;
}
}