c# - parameter - Obtener el nombre de la acción/Func Delegate
generic delegates in c# (2)
Tengo una situación extraña en la que necesito obtener el nombre del delegado como una cadena. Tengo un método genérico que se ve así.
private T Get<T>(T task, Action<T> method) where T : class
{
string methodName = method.Method.Name //Should return Bark
}
y lo estoy llamando así
private void MakeDogBark()
{
dog = Get(dog, x=>x.Bark());
}
Pero en lugar de ver "Ladrar", veo esto "<MakeDogBark>b__19"
. Parece que me está dando el nombre del método que realizó la llamada inicial en lugar del nombre del delegado.
Alguien sabe cómo hacer esto?
Le está dando el nombre del método que es la acción del delegado. Eso simplemente se implementa con una expresión lambda.
Actualmente tienes un delegado que a su vez llama a Bark. Si desea usar Bark
directamente, deberá crear un delegado abierto para el método Bark
, que puede no ser terriblemente sencillo. Eso es suponiendo que realmente quieras llamarlo. Si no necesita llamarlo, o sabe que se lo llamará en el primer argumento de todos modos, puede usar:
private T Get<T>(T task, Action method) where T : class
{
string methodName = method.Method.Name //Should return Bark
}
private void MakeDogBark()
{
dog = Get(dog, dog.Bark);
}
Podría solucionar esto haciendo que el parámetro sea un árbol de expresiones en lugar de un delegado, pero solo funcionaría si la expresión lambda fuera solo una llamada de método.
Puede obtener el nombre de la llamada al método haciendo que el parámetro sea una expresión en lugar de un delegado, tal como lo mencionó Jon.
private T Get<T>(T task, Expression<Action<T>> method) where T : class
{
if (method.Body.NodeType == ExpressionType.Call)
{
var info = (MethodCallExpression)method.Body;
var name = info.Method.Name; // Will return "Bark"
}
//.....
}