注意:这个问题是在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;
    }
}