gpt4 book ai didi

c# - 如何传递具有可变数量参数的 Func

转载 作者:行者123 更新时间:2023-12-02 19:35:22 26 4
gpt4 key购买 nike

因此,我尝试能够传递具有可变数量参数的 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,您需要关闭所需的“参数”,这样您就可以有效地添加其他参数。

// No arguments
var result = GetValue("Bob", () => { return "Bob Smith"; });

// 1 argument
var i = ...;
var result = GetValue("Joe", () => { return "Joe " + i.ToString(); });

// 2 arguments
var i = ...;
var e = ...;
var result = GetValue("Henry", () => {
return $"i: {i.ToString()}, e: {e.ToString()}";
});

否则,如果您确实想要传递具有任意数量参数的任何委托(delegate),请将参数设置为Delegate,但您必须提供委托(delegate)的确切类型,并且您必须提供调用的参数。

public object GetValue<T>(string name, Delegate func, params object[] args) { 
var result = func.DynamicInvoke(args);
}
var result = GetValue("Bob", new Func<object>(() => { return "Bob Smith"; }));

// 1 argument
var result = GetValue("Joe", new Func<T, object>((i) => { return "Joe " + i.ToString(); }), argI);

// 2 arguments
var result = GetValue("Henry", new Func<T1, T2, object>((i,e) => {
return $"i: {i.ToString()}, e: {e.ToString()}";
}), argI, argE);

关于c# - 如何传递具有可变数量参数的 Func<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50593660/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com