Можете ли вы назвать параметры в типе Func <T>? - PullRequest
19 голосов
/ 07 июня 2011

У меня есть «карта отправки», определенная так:

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

Это позволяет мне легко отправлять различные методы в зависимости от имени экземпляра DynamicEntity.

Чтобы избежатьненавидят все, кто постоянно поддерживает код, существует ли какой-либо способ именования параметров в Func, чтобы дать некоторое представление о том, что такое DynamicEntity?

Ответы [ 4 ]

27 голосов
/ 07 июня 2011

Вы не можете сделать это со встроенными типами 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;
15 голосов
/ 01 февраля 2018

Начиная с C # 7, вы можете достичь этого, используя именованные кортежи следующим образом:

Func<(string firstName, string lastName), string> f = (data) => data.firstName + data.lastName;
f(("Foo", "Bar"));
7 голосов
/ 07 июня 2011

Вы можете создать класс, который содержит ваши «параметры» и передать его в функцию?Таким образом, вы можете назвать их как угодно.

Насколько я знаю, вы не можете назвать их встроенными.

0 голосов
/ 07 июня 2011

Я не думаю, что это возможно, к сожалению. Если у вас есть экземпляр делегата, созданный с помощью лямбда-функции или другого метода, вы теряете имена аргументов, которые сопровождали его. Так что нет поддержки intellisense.

Однако вы всегда можете узнать имена параметров, проверив параметры связанного объекта MethodInfo для экземпляра. Вы просто не получите поддержку во время компиляции.

например.,

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