Можете ли вы назвать параметры в типе Func <T>?
У меня есть "карта отправки", определенная как таковая:
private Dictionary<string, Func<DynamicEntity, DynamicEntity, IEnumerable<DynamicEntity>, string>> _messageProcessing;
Это позволяет мне легко отправлять различные методы в зависимости от имени экземпляра DynamicEntity.
Чтобы избежать ненависти всех, кто сохраняет код навсегда больше, есть ли способ присвоить имена параметрам в Func, чтобы дать некоторый ключ, к которому относится DynamicEntity, который?
Ответы
Ответ 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