我一直无法通过典型渠道找到这个问题的答案。
在Python中我可以有以下函数定义
def do_the_needful(**kwargs):
# Kwargs is now a dictionary
# i.e. do_the_needful(spam=42, snake='like eggs', spanish='inquisition')
# would produce {'spam': 42, 'snake': 'like eggs', 'spanish': 'inquisition' }
我知道 .NET 有
ParamArray
,它会生成一系列未命名参数,类似于 Python 中的 *args
语法....NET 是否有 **kwargs
的等价物或类似的东西?
因此,不幸的是,没有办法在 C# 中模拟 Python
**kwargs
。在此过程中您总是会丢失参数名称(请参阅下面 @alelom 的评论)。
但是,您似乎要寻找的是可变参数函数。如果您想了解如何用各种编程语言实现它,最好是查看有关它的维基百科页面。
因此,根据 Wikipedia,在 C# 和 VisualBasic 中实现可变参数函数是这样完成的:
其他语言,例如 C#、VB.net 和 Java 使用不同的 方法——它们只允许相同数量的参数 要传递给可变参数函数的(超级)类型。方法内部 它们只是被收集在一个数组中。
C# 示例
public static void PrintSpaced(params Object[] objects) { foreach (Object o in objects) Console.Write(o + " "); } // Can be used to print: PrintSpaced(1, 2, "three");
VB.Net 示例
Public Shared Sub PrintSpaced(ParamArray objects As Object()) For Each o As Object In objects Console.Write(o & " ") Next End Sub
' 可用于打印:PrintSpaced(1, 2, "三")
我想到的模式是创建一个方法,将名称值 arg 数组转换为 OrderedDictionary,然后在函数中接受 OrderedDictionary 参数作为参数。
Public Shared Function p2D(ParamArray args As Object()) As OrderedDictionary
Dim kwargs As New OrderedDictionary
For i As Integer = 0 To aNV.Length - 1 Step 2
kwargs.Add(aNV(i), aNV(i + 1))
Next
Return kwargs
End Function
用途:
Public Shared Sub do_foo(kwargs as OrderedDictionary)
' parse kwargs and do stuff...
End Sub
' Call do_foo
do_foo(p2D("arg1", 1, "arg2", 2, "arg3", 3))
话虽如此,最好不要用 VB 编程,因为它是一种非常糟糕的语言,不适合做任何真正复杂的事情,而且它的 OOP 实现非常糟糕。如有疑问,请使用 C#。