c# - 相当于 Actions 和 Func 的 Tuple.Create

标签 c# .net delegates .net-6.0

.NET 中的 Tuple 的一个很酷的事情是,无需键入:

var x = new Tuple<string, string, int, float, int>("Hi", "Hello", 15, 5.5f, 500);

您可以输入

var x = Tuple.Create("Hi", "Hello", 15, 5.5f, 500);

并且将为您创建正确的通用元组

相同的快捷方式对于 ActionFunc 来说是有益的。由于这似乎对他们来说不可用,因此如何实现它,而不是键入以下内容:

var x = new Action<string, float, int>((s, f, i) => { /* do something */ });

或者更糟糕的是,这个:

var x = new Action<string, float, int>((string s, float f, int i) => { /* do something */ });

你可以输入一些像这样的好东西:

var x = Action.Create((string s, float f, int i) => { /* do something */ });
// x becomes an Action<string, float, int>

虽然长度相同,但后一个例子让参数的含义更加清晰,整体看起来更加整洁。

如何实现这样的扩展方法?请注意,我使用的是 .NET 6.0 和 C# 10.0

最佳答案

从 C# 10 开始,有“natural function types ”。您甚至不需要这样的方法 - 只需直接编写 lambda 并将其分配给 var,C# 就可以推断委托(delegate)的类型。

var action = (string s, float f, int i) => { ... };

请注意,如果参数太多,这不一定是ActionAction 类型的数量有限,最多支持有限数量的参数。

如果你真的想要一个方法,你可以这样做:

var anotherAction = Actions.Create((string s, float f, int i) => { ... });

public static class Actions {
    public static T Create<T>(T t) where T: Delegate => t;
}

因为当您调用方法时,自然函数类型也可以工作。

关于c# - 相当于 Actions 和 Func 的 Tuple.Create,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76502871/

相关文章:

c# - 为什么我的圈子的值为零?

c# - 在 catch block 中继续

ios - 如何使用协议(protocol)/委托(delegate)在 UIViewController 之间传递数据

ruby-on-rails - 显示委托(delegate)属性的验证错误

c# - 将委托(delegate)/命令作为参数传递给 MVVM 中的另一个命令

c# - 如何在一行 C# Web 应用程序中的不同 <td> 标记中的标签和文本框之间留一个空格?

c# - 将 .txt 文件内容导入到 datagridview

c# - Mono/.NET 4.0 是否实现 AppDomain.FirstChanceException?

.net - 对象浏览器支持哪些 XML 注释标签

c# - 如何在 NopCommerce 中实现 Action 过滤器