How to get Method Name of Generic Func<T> passed into Method

c#, func, generics

Solution

You're looking at the name of the lambda expression (generated by the compiler), instead of the name of the method called inside the lambda.

You have to use an `<Expression<Func<T>>` instead of a `Func<T>`. Expressions can be parsed and analyzed.

Try

public IEnumerable<T> GetData<T>(Expression<Func<IEnumerable<T>>> callbackExpression) 
where T : class    
{
    var methodCall = callbackExpression.Body as MethodCallExpression;
    if(methodCall != null)
    {
        string methodName = methodCall.Method.Name;
    }

    return callbackExpression.Compile()();
}

Problem

I'm trying to get the method name of a function passed into an object using a .Net closure like this: Method Signature ``` public IEnumerable<T> GetData<T>(Func<IEnumerable<T>> WebServiceCallback) where T : class { // either gets me '<LoadData>b__3' var a = nrdsWebServiceCallback.Method.Name; var b = nrdsWebServiceCallback.GetInvocationList(); return WebServiceCallback(); } ``` I'm calling it like this: ``` SessionStateService.Labs = CacheManager.GetData(() => WCFService.GetLabs(SessionStateService.var1, SessionStateService.var2)); ``` Seeing 'b__3' instead of WCFServce.GetLabs(..) etc

Original source