创建一个C#函数功能<>类型别名

问题描述 投票:4回答:1

我的工作有几个地方,用户可以注入一个lambda函数来定制一个复杂的后台进程库。他们基本上是做小的修改图书馆是如何工作的。该库处理动态类型,在编译或运行时创建的,因此没有具体的类,而我可以添加抽象的或虚拟的成员。该库可以是处理与客户端几十定义的配置的从几个到大量的λ的自定义的(每个定制安装于动态定义的结构的客户正在建设中的一个,并传递到库)。

lambda函数的签名可以是一个有点复杂,但这样的事情:

Func<SourceList, PredList, Dictionaries, object>

现在,我发现自己在做公共和私有接口和变量在重复这个复杂的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);
}

用户将做到这一点:

someObject.AddProcessFunction((fromList, predList, dict) => { some process impl }
someOtherObj.AddTargettedProcessFunction("Account", 
                                         (fromList, predList, dict) => { some process impl }
...

如果我必须做出改变,以拉姆达的签名,我在很多地方进行修改。我希望有一种方法来定义一个类型,我可以用这个签名保存在一个地方。我也发现,我可以这样做:

using ProcessFunc = System.Func<SourceList, PredList, Dictionaries, object>;

...

private readonly IList<ProcessFunc> _processFunctions = new List<ProcessFunc>();
public void AddProcessFunction(ProcessFunc processFunction)
{
    _processFunctions.Add(processFunction);
}

这不会是我想要的,但这并不是因为它已经在在完全相同的方式该库的每个cs文件被重复一个很好的解决方案(或者相反,它可以在每个文件有一个完全不同的别名,并且还工作得很好,因为这基本上是一个宏替换)。

虽然这种方法清理代码相当多,并且它能够减少函数功能<>定义的重复,全部函数功能<>定义仍一遍又一遍地重复的所产生的库的文档中,由于重复的完整定义方法签名。这使得它很难对文档的阅读,看看哪些功能采取同样的拉姆达,因为他们有比较多复杂的参数,他们将永远不会看到ProcessFuncTypeA或ProcessFuncTypeB,于是两个lambda表达式是类似的,但不同的是很难从视觉上分辨(当然,我会用不同的签名好名字)。

我希望的是这样的:

public Function ProcessFunc : Func<SourceList, PredList, Dictionaries, object>;

有没有更好的办法(甚至另一种方式)来定义函数求<>键入在一个地方,在库中的多个地方重新使用它?我失去了一些东西明显?

谢谢!

c# lambda delegates
1个回答
12
投票

C# Reference Source有时可以提供内部是如何实现的有用的提示,以及如何可以实现类似的事情。

所以,用3个参数的一般Func<>被定义为

public delegate TResult Func<in T1, in T2, in T3, out TResult>(T1 arg1, T2 arg2, T3 arg3);

因此,你可以定义你的具体Func<>变化为

public delegate object ProcessFunc(SourceList arg1, PredList arg2, Dictionaries arg3);
© www.soinside.com 2019 - 2024. All rights reserved.