c# - 参数数量未知的 Func<>

标签 c# .net generics functional-programming clr

考虑以下伪代码:

TResult Foo<TResult>(Func<T1, T2,...,Tn, TResult> f, params object[] args)
{
    TResult result = f(args);
    return result;
}

函数接受 Func<>具有未知数量的通用参数和相应参数的列表。可以用C#写吗?如何定义和调用Foo ?我如何通过 argsf

最佳答案

您可以将 DelegateDynamicInvoke 一起使用。

有了它,您就不需要处理 f 中的 object[]

TResult Foo<TResult>(Delegate f, params object[] args)
{
    var result = f.DynamicInvoke(args);
    return (TResult)Convert.ChangeType(result, typeof(TResult));
}

用法:

Func<string, int, bool, bool> f = (name, age, active) =>
{
    if (name == "Jon" && age == 40 && active)
    {
        return true;
    }
    return false;
}; 

Foo<bool>(f,"Jon", 40, true);

我创建了一个显示一些示例的 fiddle :https://dotnetfiddle.net/LdmOqo


注意:

如果你想使用方法组,你需要对Func进行显式转换:

public static bool Method(string name, int age)
{
    ...
}
var method = (Func<string, int, bool>)Method;
Foo<bool>(method, "Jon", 40);

fiddle :https://dotnetfiddle.net/3ZPLsY

关于c# - 参数数量未知的 Func<>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22834120/

相关文章:

c# - 在 Identity Server 4 中为 OpenID Connect 注册 IIdentityServerInteractionService

c# - 使用 as 运算符进行转换,即使在使用 is 运算符验证 C# 中的类类型之后?

Java:泛型中的不同接口(interface)

android - 为什么我不能在Kotlin中将Class类型用作通用参数?

c# - 将字节数组的 C++ 结构转换为 C#

c# - System.Timers.Timer timer1_Elapsed 未触发!帮助!

c# - Entity Framework "An object with the same key already exists in the ObjectStateManager."- 我无法理解如何从这里开始做什么

c# - GetHashCode 是否足够强大,或者我是否需要另一个哈希函数?

c# - 如何确定元组类型?

java - 我们如何通过使用泛型/任何其他方式删除代码冗余/改进代码