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
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()();
}