【发布时间】:2023-03-24 07:29:02
【问题描述】:
所以我试图能够传递具有可变数量参数的 Func。
类似:
public object GetValue<T>(string name, Func<object> func) {
var result = func.DynamicInvoke();
}
当 func 的参数数量已知时,上述函数/签名非常有效。但是,如果您希望在运行时之前不知道参数的数量,它就会很快崩溃。
我想更改方法签名以允许以下情况,而不使用方法重载:
// No arguments
var result = GetValue("Bob", () => { return "Bob Smith"; });
// 1 argument
var result = GetValue("Joe", (i) => { return "Joe " + i.ToString(); });
// 2 arguments
var result = GetValue("Henry", (i,e) => {
return $"i: {i.ToString()}, e: {e.ToString()}";
});
现在不需要超过 2 个参数。但将来可能需要。调用语法对我来说是最重要的一点。我宁愿不让调用者投射任何东西。
我查看了this question and the answers,但它们似乎都需要一些我不想使用的调用语法。
有什么想法可以实现吗?
【问题讨论】:
-
我不知道有什么方法可以做到这一点。鉴于目前您只需要三个重载(它们都可以将它们的实现委托给私有方法),我怀疑这是最好的方法。请注意,您还没有展示在“直到运行时参数的数量[将]未知”的上下文中您将如何结束。你还在源代码中使用 lambda 表达式,对吧?目前这是一个 XY 问题。如果您能给我们提供更多背景信息,我们更有可能为您提供帮助。
-
@DaisyShipton:感谢您的 cmets。不幸的是,我很难描述这个用例,因为我仍在尝试构建它。我有一种情况,我需要调用者提供回调。我将为回调提供一些参数。把它想象成 jQuery
.Each方法。我希望调用者能够指定他们是否对任何 args、1 个 args 或两者都不感兴趣。我想我可能只需要一个 2-arg 签名.. 但这不会完全达到我希望的效果:) -
您似乎关心如何编写 Func,因此它将接受可变数量的参数。但对我而言,真正的问题是——您打算如何编写调用该函数的代码?该代码不需要填充参数吗?它从哪里获得论点,它如何知道要获得多少?
-
不想使用重载的原因是什么?这就是大多数 API 在这种情况下所做的事情。例如,LINQ 的 Select 方法有类似的场景。一个重载仅提供该项目。另一个重载提供索引和项目。
-
OP,我知道参数是由被调用的方法生成的。我的问题是如何。它如何知道传递 1、2 或 3 个参数?它如何知道应该进入它们的内容?如果调用者不能是通用的,那么将接收器设为通用是没有意义的。