![](/img/trans.png)
[英]How can i get the parameter values of an anonymous method passed as a func?
[英]How to get Method Name of Generic Func<T> passed into Method
我正在尝试使用 .Net 闭包将 function 的方法名称传递给 object,如下所示:
方法签名
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();
}
我这样称呼它:
SessionStateService.Labs = CacheManager.GetData(() =>
WCFService.GetLabs(SessionStateService.var1, SessionStateService.var2));
看到 'b__3' 而不是 WCFServce.GetLabs(..) 等
您正在查看 lambda 表达式的名称(由编译器生成),而不是在 lambda 内部调用的方法的名称。
您必须使用<Expression<Func<T>>
而不是Func<T>
。 可以解析和分析表达式。
尝试
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()();
}
实际传递给您的函数的是匿名 lambda 函数 ( () => WCFService.Etc
),因此您看到的是实际方法名称 - <LoadData>b__3
是匿名方法的自动生成名称。
你真正需要的是被称为调用的方法内的方法。 为此,您需要深入研究表达式。 而不是Func<IEnumerable<T>>
,将您的参数定义为Expression<Func<IEnumerable<T>>>
,并调用以下代码:
var body = nrdsWebServiceCallback.Body as MethodCallExpression;
if (body != null)
Console.WriteLine(body.Method.DeclaringType.Name + "." + body.Method.Name);
这是另一种解决方法:
因为您正在使用回调(匿名函数),这是其名称在.Method.Name
属性中表示的.Method.Name
。
您可以使用 RegEx 从中获取方法的名称:
/// <summary>
/// Gets a string between the characters '<' and '>'
/// Which is the method name for anonymous methods.
/// </summary>
/// <param name="methodName"></param>
/// <returns>Simple method name</returns>
private static string GetMethodName(string methodName)
{
var pattern = @"(?<=\<)(.*?)(?=\>)";
var regex = new Regex(pattern);
return regex.Match(methodName).Value;
}
它将采用字符串: <LoadData>b__3
并返回函数名: LoadData
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.