Sco*_*ner 5 c# lambda delegates
我正在开发一个库,它有几个用户可以注入lambda函数来定制复杂后台进程的地方.它们实质上是对库的工作方式进行了少量修改.该库正在处理在编译或运行时构建的动态类型,因此没有具体的类可以添加抽象或虚拟成员.该库可以处理许多客户端定义的配置,包括从几个到大量的lambda自定义(每个自定义都附加到客户端正在构建的动态定义的结构之一,并传递给库).
lambda函数的签名可能有点复杂,如下所示:
Func<SourceList, PredList, Dictionaries, object>
Run Code Online (Sandbox Code Playgroud)
现在,我发现自己正在做的是在公共和私有接口和变量中重复这个复杂的Func <>.就像是:
private readonly IList<Func<SourceList, PredList, Dictionaries, object>> _processFunctions
= new List<Func<SourceList, PredList, Dictionaries, object>>();
public void AddProcessFunction(Func<SourceList, PredList, Dictionaries, object> processFunction)
{
_processFunctions.Add(processFunction);
}
Run Code Online (Sandbox Code Playgroud)
用户将执行此操作:
someObject.AddProcessFunction((fromList, predList, dict) => { some process impl }
someOtherObj.AddTargettedProcessFunction("Account",
(fromList, predList, dict) => { some process impl }
...
Run Code Online (Sandbox Code Playgroud)
如果我必须更改lambda的签名,我必须在很多地方修改它.我希望有一种方法可以定义一种类型,我可以用它来将这个签名存储在一个地方.我发现我能做到这一点:
using ProcessFunc = System.Func<SourceList, PredList, Dictionaries, object>;
...
private readonly IList<ProcessFunc> _processFunctions = new List<ProcessFunc>();
public void AddProcessFunction(ProcessFunc processFunction)
{
_processFunctions.Add(processFunction);
}
Run Code Online (Sandbox Code Playgroud)
这就是我想要的,但这不是一个很好的解决方案,因为它必须以完全相同的方式在库中的每个.cs文件中重复(或者相反,它可以在每个文件中具有完全不同的别名,并且仍然可以正常工作,因为这实际上是一个宏替代品).
虽然这种方法清理了相当多的代码,并且确实减少了Func <>定义的重复,但是在生成的库文档中仍然反复重复完整的Func <>定义,因为完整的定义在方法签名.这使得文档的读者很难看到哪些函数采用相同的lambda来比较多个复杂的参数,它们永远不会看到ProcessFuncTypeA或ProcessFuncTypeB,所以两个相似但不同的lambda更难以在视觉上区分(当然我会为不同的签名使用好名字).
我希望的是这样的:
public Function ProcessFunc : Func<SourceList, PredList, Dictionaries, object>;
Run Code Online (Sandbox Code Playgroud)
是否有更好的方法(甚至是另一种方式)在一个地方定义Func <>类型并在库中的多个位置重用它?我错过了一些明显的东西吗
谢谢!
Net*_*age 12
在C#参考源有时可以提供内部是如何实现的有用的提示,以及如何可以实现类似的事情.
因此,Func<>
具有3个参数的泛型定义为
public delegate TResult Func<in T1, in T2, in T3, out TResult>(T1 arg1, T2 arg2, T3 arg3);
Run Code Online (Sandbox Code Playgroud)
因此,您可以将特定的Func<>
变体定义为
public delegate object ProcessFunc(SourceList arg1, PredList arg2, Dictionaries arg3);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1141 次 |
最近记录: |