你能用Func <t>类型命名参数吗?</t>

时间:2011-06-07 08:38:50

标签: c# anonymous-function

我有一个“调度图”定义如下:

private Dictionary<string, Func<DynamicEntity, DynamicEntity, IEnumerable<DynamicEntity>, string>> _messageProcessing;

这允许我根据DynamicEntity实例的名称轻松调度到不同的方法。

为了避免被更多地维护代码的每个人所厌恶,有没有办法在Func中命名参数以提供哪些DynamicEntity是哪个?

4 个答案:

答案 0 :(得分:25)

你不能使用内置的Func类型,但是很容易创建自己的自定义委托类型并以类似的方式使用它:

_messageProcessing.Add("input", (x, y, z) => "output");
_messageProcessing.Add("another", (x, y, z) => "example");

// ...

delegate string DispatchFunc(DynamicEntity first, DynamicEntity second,
                             IEnumerable<DynamicEntity> collection);

Dictionary<string, DispatchFunc> _messageProcessing;

答案 1 :(得分:12)

从C#7开始,您可以通过这种方式使用命名元组实现它:

Func<(string firstName, string lastName), string> f = (data) => data.firstName + data.lastName;
f(("Foo", "Bar"));

答案 2 :(得分:7)

您可以创建一个包含“参数”的类并将其提供给func吗?这样你就可以为他们命名。

据我所知,你不能将它们命名为内联。

答案 3 :(得分:0)

我不认为不幸的是。一旦有了一个从lambda或其他方法创建的委托实例,就会丢失随之而来的参数名称。所以没有智能感知支持。

但是,您始终可以通过检查实例的关联MethodInfo对象的参数来找出参数的名称。你只是不会得到它的编译时支持。

如,

Action<string, int> myAction = (myString, myInt) => { };
var parameters = myAction.Method.GetParameters();
var paramNames = String.Join(", ", parameters.Select(p => p.Name)); // myString, myInt