8

**kwargsC# 中是否有某种相当于 Python 的东西?我希望能够将可变数量的命名参数传递给函数,然后将它们作为类似于字典的内部函数获取并循环它们。

4

5 回答 5

13

C# 中没有任何东西可以让您像这样传递任意命名参数。

您可以通过添加一个参数来接近Dictionary<string, object>,这可以让您执行类似但需要构造函数的操作,“参数名称”是字符串和一些额外的大括号:

static void Method(int normalParam, Dictionary<string, object> kwargs = null)
{
   ...
}

Method(5, new Dictionary<String, object>{{ "One", 1 }, { "Two", 2 }});

你可以通过使用ObjectToDictionaryRegistryhere来接近,它允许你传入一个匿名对象,不需要你命名字典类型,将参数名称作为字符串传递或添加相当多的大括号:

static void Method(int normalParam, object kwargs = null)
{
    Dictionary<string, object> args = ObjectToDictionaryRegistry(kwargs);
    ...
}

Method(5, new { One = 1, Two = 2 });

但是,这涉及动态代码生成,因此会降低性能。

就语法而言,我怀疑你永远能够摆脱这需要的 `new { ... }' 包装器。

于 2012-12-18T14:24:48.217 回答
2

如果您特别想要一系列KeyValuePairs而不是值数组,您可以执行以下操作:

public class Foo
{
    public Foo(params KeyValuePair<object, object>[] myArgs)
    {
        var argsDict = myArgs.ToDictionary(k=>k.Key, v=>v.Value);
        // do something with argsDict
    }
}

myArgs将是您可以迭代或转换为字典的数组,KeyValuePair<object, object>如上所示。KeyValuePair<>不过请注意,如果您使用相同的键传递多个 s ,则转换为字典可能会失败。在转换为字典之前,您可能需要提前进行一些检查。

你可以这样称呼它:

KeyValuePair<object, object> myKvp1 = new KeyValuePair<object, object>(someKey1, someValue1);
KeyValuePair<object, object> myKvp2 = new KeyValuePair<object, object>(someKey2, someValue2);
KeyValuePair<object, object> myKvp3 = new KeyValuePair<object, object>(someKey3, someValue3);

Foo foo = new Foo(myKvp1, myKvp2, myKvp3);
于 2012-12-18T14:08:55.973 回答
1

是的。我相信,在 C# 4.0 中添加了使用可选参数和命名参数的能力。

http://msdn.microsoft.com/en-us/library/dd264739(v=vs.100).aspx

于 2012-12-18T14:12:41.887 回答
0
void paramsExample(object arg1, object arg2, params object[] argsRest)
{
    foreach (object arg in argsRest)
    { /* .... */ }
}

像这样称呼它,

paramsExample(1, 0.0f, "a string", 0.0m, new UserDefinedType());
于 2012-12-18T14:02:54.120 回答
0

您可以使用参数列表作为函数的最终参数,如下所示:

void paramsExample(object arg1, object arg2, params object[] argsRest) {
    foreach (object arg in argsRest)
    { /* .... */ }
}

可以使用任意数量的任意类型的参数调用该方法。

paramsExample(1, 0.0f, "a string", 0.0m, new UserDefinedType());

这是一个强类型参数,所以如果我想使用字符串列表,我可以这样做:

 public string Concat(string separator, params string[] strings) {
      string result = "";
      for (int i = 0; i < strings.Length; i++) {
          if (i > 0)
              result += separator;
          result += strings[i];
      }    
      return result;
 }

调用:

MessageBox.Show(Concat("+", "Anders", "Eric", "Scott", "Duncan") + " = great team");

在此处查看更多信息:http: //blogs.msdn.com/b/csharpfaq/archive/2004/05/13/how-do-i-write-a-method-that-accepts-a-variable-number- of-parameters.aspx

于 2012-12-18T14:10:43.120 回答