【问题标题】:Lua style parameters in C#C#中的Lua样式参数
【发布时间】:2017-11-01 09:56:03
【问题描述】:

在 Lua 中,可以通过解包列表将参数传递给函数,并且被调用的函数在其命名参数项中接收这些参数值...

local function someFunkyFunc( firstParam, secondParam, thirdParam )
  print( firstParam, secondParam, thirdParam ) -- prints the three parameters
end

local tbl = { "first", "second", "third" } -- parameter values to be passed

someFunkyFunc( unpack( tbl ) ) -- calling the function with named parameters

这在 C# 中是否可能(以某种形式)?如果有,怎么做?

这与 Python 不同,因为我们谈论的是 Lua,而不是 Python。

【问题讨论】:

  • 重复谈论 python,但从听起来 python 和 lua 做同样的事情 (someFunkyFunc(**tbl))
  • 很多语言也是如此,但我们谈论的是一种特定的语言,它是符号。
  • 语言无关紧要,您说的是通过值数组传递参数。副本中的答案与您接受的答案共享详细信息(尽管没有那么详细)....
  • 语言不是无关紧要的。这正是重点。我想知道如何用一种语言做一些我可以用另一种特定语言做的事情。告诉我如何在 Python 中执行此操作并不能告诉我如何在 C# 中执行此操作或是否可行。是的,这是一个类似的问题,但是知道如何在 Python 中执行此操作与在 C# 中执行完全不同,因为在一种语言本身支持该选项,而在另一种语言中,它是一个提供该功能的库。

标签: c# lua parameter-passing


【解决方案1】:

您可以将方法分配给Delegate,然后使用DynamicInvoke 提供参数数组:

Action<object, object, object> action = someFunkyFunc;
object[] tbl = { "first", "second", "third" };
action.DynamicInvoke(tbl);

请注意,这会带来显着的性能成本和静态类型的损失。

或者,您可以使用反射来获取MethodInfo for someFunkyFunc可以调用Invoke,尽管它具有相同的缺点。

【讨论】:

  • 如果突然出现4个参数怎么办?这仍然是一个固定的参数列表。
  • @PatrickHofman unpack 也是如此。您有责任确保数组具有正确的值数量和类型。在这种情况下,它们只是硬编码,就像在 OP 的情况下一样,因为它是一个示例。在实际代码中,数组将动态生成,并且委托可以动态计算,只要您确保它们匹配即可。
  • 天哪,他明白了!也谢谢你!
【解决方案2】:

不,没有方法可以解压列表并将它们作为参数提供给具有动态类型和参数计数的方法。

你能做的最好的就是传入一个字符串和对象的字典 (Dictionary&lt;string, object&gt;)。

如果不需要参数名,也可以使用params object[] values

另一种选择是使用反射,您可以在其中动态映射方法及其参数,但是,这是一种容易出错的方法,我会尽量避免采用。

【讨论】:

  • 说你做不到是错误的。为什么会有人支持它?
  • 所以你可以解压一个列表并将它们转换成方法参数?
  • 是的,你可以这样做。
  • 那是怎么回事?
  • 我有一个显示多种方式的答案。考虑到您已经对此发表了评论,我知道您已经阅读了它,所以我不知道您为什么要发表这样的评论。
猜你喜欢
  • 2015-03-29
  • 2012-06-28
  • 2021-03-11
  • 1970-01-01
  • 1970-01-01
  • 2012-03-07
  • 1970-01-01
  • 2011-02-26
  • 1970-01-01
相关资源
最近更新 更多