c# - 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-Implement和https:// /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% 的情况下看起来都一样。
解决方案
您需要从一个地方调用如此不同的代表,这似乎很奇怪。
我认为你需要像“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);
}
等等。
它可能无法解决您的问题,但会帮助您以其他方式找到解决方案。
推荐阅读
- ios - 在 QuickBlox Swift 中将用户添加到联系人列表
- java - Collections.sort() 给我编译错误。如何在 ArrayList 上进行 sort()
, T 在运行时(动态)在哪里? - php - 过滤和排序在数字和日期 Laravel 兰花上无法按预期工作
- github-actions - github 操作:可重用库?
- sql-server - 如何编写查询以连接 Northwind 数据库中 3 个单独表中的列
- c - 与测量工具不一致的时钟周期,这种不一致的周期究竟来自哪里?
- java - 我的代码违反了 DRY 原则,但不确定如何进行重构
- flutter - 向 CircleAvatar 添加颜色叠加
- macos - docker-compose keeps previous environment variables after restart
- mysql - 绑定子表单未加载