首页 > 解决方案 > C#:具有可变数量参数的函数列表

问题描述

在 C# 中是否有可能具有高阶函数,该函数采用具有任意数量和类型的参数和返回值的函数,例如,

// No valid C# code
void MyFunction(Func f)
{
    // do something
}
MyFunction(string.Join);      // type: Func<String, IEnumerable<String>, String>
MyFunction(string.CompareTo); // type: Func<object, int>
// ...

我想,这个问题真的归结为是否有一个最通用的函数类型,它可以容纳任何可能具有不同数量和类型的参数的函数。

我的用例如下:我有一个接受MethodInfo对象的方法。目前,我做类似的事情

DoSomething(((Func<object, int>)string.CompareTo).Method)

但是,对于我期望的每种不同类型的功能,我都必须重复此操作。我更喜欢一个DoSomething可以自己确定类型的解决方案,所以我只给它 Function 本身而不是MethodInfo对象。

编辑:

更准确地说,我正在使用 ReLinq 编写一个 Linq-To-X 提供程序。我从有关此主题的教程博客中获得了一些示例代码(https://www.codeproject.com/Articles/42059/re-linq-ishing-the-Pain-Using-re-linq-to-Implementhttps:// /weblogs.asp.net/dixin/understanding-linq-to-sql-10-implementing-linq-to-sql-provider)。Sum对于像or这样的急切执行函数Count,我需要将它们包装到一个MethodCallExpression对象中。

在示例代码中,它是这样解决的:

public static IQuery CountToSql<T>(this IQueryable<T> source)
{
    ArgumentChecker.CheckNull(source, nameof(source));
     var expression =
        Expression.Call(
            null,
            GetMethodInfo(Queryable.Count, source),
            new Expression[] { source.Expression }
            );
     return ToQuery(expression, ((DbQueryable<T>)source).SyntaxProvider);
}

private static MethodInfo GetMethodInfo<T1, T2>(Func<T1, T2> f, T1 unused1 => f.Method;

private static MethodInfo GetMethodInfo<T1, T2, T3>(Func<T1, T2, T3> f, T1 unused1, T2 unused2) => f.Method;

// ...

但是,我不想为每种类型的函数(例如,、、...)都写Queryable.Sum这个Queryable.Count。当前的解决方案需要它。我只想要一种可以处理所有问题的方法,因为它们在 90% 的情况下看起来都一样。

标签: c#function

解决方案


您需要从一个地方调用如此不同的代表,这似乎很奇怪。

我认为你需要像“EventDispatcher”这样的东西,当你的代码得到应该被转换为对象的数据时,但是在调用之后你想要操作一个真实的对象。

如果我错了,请告诉更多关于任务的信息。

如果我是对的,您必须用泛型替换反射。创建将通过 Action 包装您委托的方法。

    public Action<object> WrapCall<T, K>( Func<T, K> func)
    {
        return (data) => func((T)data);
    }

    public Action<object, object> WrapCall<T1, T2, K>(Func<T1, T2,K> func)
    {
        return (t1Data, t2Data) => func((T1)t1Data, (T2)t2Data);
    }

等等。

它可能无法解决您的问题,但会帮助您以其他方式找到解决方案。


推荐阅读