Подтвердить что ты не робот

Можете ли вы назвать параметры в типе Func <T>?

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

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

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

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

4b9b3361

Ответ 1

Вы не можете сделать это со встроенными типами 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;

Ответ 2

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

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

Ответ 3

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

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

например.

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