C# 匿名类型函数声明
让我们有一个函数:C# 匿名类型函数声明,c#,anonymous-function,C#,Anonymous Function,让我们有一个函数: Func<argsFoo, resultFoo> foo= x=>new resultFoo(x); Func<argsBar, resultBar> bar= x=>new resultBar(x); Func<argsBaz, resultBaz> baz= x=>new resultBaz(x); Func foo=x=>newresultfoo(x); Func bar=x=>新结果栏(x); Func baz=
Func<argsFoo, resultFoo> foo= x=>new resultFoo(x);
Func<argsBar, resultBar> bar= x=>new resultBar(x);
Func<argsBaz, resultBaz> baz= x=>new resultBaz(x);
Func foo=x=>newresultfoo(x);
Func bar=x=>新结果栏(x);
Func baz=x=>新结果baz(x);
我想创建一个复杂函数,它使用上面声明的所有函数
像这样:
Func
<
Func<argsFoo, resultFoo>,
Func<argsBar, resultBar>,
Func<argsBaz,resultBaz>,
fooBarBazResult
> fooBarBaz=...
Func
<
Func,
Func,
Func,
fooBarBazResult
>fooBarBaz=。。。
关键是这样的声明正在扼杀程序的可读性。在这种情况下,类型推断不起作用
问题:我可以用这样的东西吗
FooBarBaz<typeof(foo),typeof(bar)>,typeof(baz)>>
FooBarBaz,typeof(baz)>>
我试过了,答案是否定的。
任何人都可能有另一种缩短组合函数声明的解决方案吗?好的,您可以在文件顶部添加一个
,使用语句简化:
using SomeName = Func<Func<ArgsFoo, ResultFoo>, Func<ArgsBar, ResultBar>, Func<ArgsBaz, ResultBaz>>;
您始终可以声明自己的委托来描述您的方法:
public delegate resultMy MyDelegate(argsMy arg)
并使用较短的名称MyDelegate
Func<FooDelagate, BatDelegate, BazDelegate>
Func
甚至您也可以命名该委托以简化代码。这看起来很奇怪。Func
的最后一个通用参数是返回类型。您有三个具有三种不同返回类型的Func,但仍然试图将它们与一个Func组合,该Func将第一个Func作为输入,并返回一个类似于第三个Func的Func?你到底想在这里做什么?与你的要求无关,但是lambda(x)=>{return new resultFoo(x);}
(代码中缺少分号!)可以简化一点,变成x=>new resultFoo(x)
。丹尼尔你是对的,我应该纠正示例中的错误。在这种情况下,我可以使用委托。问题是如何不使用它们:)@gleb.kudr另一个选项是反射,这会使它变得太复杂。委托在更静态的代码(如方法声明)中表现得很好。但是匿名函数被设计成轻量级的(我想),在这种情况下使用委托会使代码变得更加健壮。@gleb.kudr-Func
是一种委托类型,只是BCL中定义的一种。只能将lambda或匿名函数作为委托实例传递。
Func<FooDelagate, BatDelegate, BazDelegate>