c# - 如何通过 Func具有可变数量的参数
问题描述
所以我试图能够传递具有可变数量参数的 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 个参数。但将来可能会。调用语法对我来说是最重要的一点。我宁愿不让来电者施放任何东西。
我已经查看了这个问题和答案,但它们似乎都需要一些我不想使用的调用语法。
任何想法如何实现?
解决方案
答案是不要。首先,您试图调用一个不带参数并返回某个对象的方法。您不能只“制作”一个需要这种类型参数的函数,否则您将如何使用所需的参数调用它。
您已经在创建 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
,但您必须提供委托的确切类型,并且必须为调用提供参数。
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);
推荐阅读
- react-native - React-Native,JustifyContent:flex-end 和 space-around 行为奇怪
- javascript - “材料表” - 有没有办法将过滤与表格分开。- ReactJs
- mysql - MySQL:获取每一行的总数,然后获取每个“分组依据”的总数
- bash - 减去时间戳时意外标记“/”附近的语法错误
- string - 数据库连接字符串参数污染强化问题
- php - 如何创建第二个数组并显示大于第一个数组平均数的数字?
- python - 在Python中格式化日期时间时如何匹配str中的任意字符?
- python - 无法使用 pip install ssl 在我的本地系统中安装 ssl
- wordpress - 删除特定页面的 Jetpack 的 Open Graph 元标记
- c# - 在 DataGridView 中使用嵌套列表作为数据源的列表