首页 > 解决方案 > 如何通过 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 个参数。但将来可能会。调用语法对我来说是最重要的一点。我宁愿不让来电者施放任何东西。

我已经查看了这个问题和答案,但它们似乎都需要一些我不想使用的调用语法。

任何想法如何实现?

标签: c#func

解决方案


答案是不要。首先,您试图调用一个不带参数并返回某个对象的方法。您不能只“制作”一个需要这种类型参数的函数,否则您将如何使用所需的参数调用它。

您已经在创建 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);

推荐阅读