C# 带输出参数的Lambda泛型表达式
我试图使用带有lambda委托的表达式来获取调用方法的名称,但它没有正确格式化 到目前为止,我的问题是。。对于lambda和常规方法,我如何获得与foo.Method.Name类似的期望值 到目前为止,我已经试过使用和不使用表达式。。得到同样的结果C# 带输出参数的Lambda泛型表达式,c#,generics,lambda,expression-trees,out,C#,Generics,Lambda,Expression Trees,Out,我试图使用带有lambda委托的表达式来获取调用方法的名称,但它没有正确格式化 到目前为止,我的问题是。。对于lambda和常规方法,我如何获得与foo.Method.Name类似的期望值 到目前为止,我已经试过使用和不使用表达式。。得到同样的结果 b_uu2D 这是一个测试驱动程序,我可以在一个简单的例子中展示我所期望的。我需要支持的3种方法是: Func FuncT foo 功能性T-foo 例如: Lambda表达式是无名的。它将显示类似于的内容 .Method.Name是正确的,但由于它
class Program {
public static class ReflectionUtility {
public static string GetPropertyName<T>(Expression<Func<T>> expression) {
MemberExpression body = (MemberExpression) expression.Body;
return body.Member.Name;
}
}
static void Main(string[] args) {
Func<int, bool> lambda = i => i < 5;
Func<int, bool> del = delegate(int i) { return i < 5; };
// Create similar expression #1.
Expression<Func<int, bool>> expr1 = i => i < 5;
// Compile the expression tree into executable code.
Func<int, bool> exprC1 = expr1.Compile();
// Invoke the method and print the output.
Console.WriteLine("lambda(4) = {0} : {1} ", lambda(4), lambda.Method.Name);
Console.WriteLine("del (4) = {0} : {1} ", del(4), del.Method.Name);
Console.WriteLine("expr1 (4) = {0} : {1} ", exprC1(4), exprC1.Method.Name);
Console.WriteLine(" = {0}", ReflectionUtility.GetPropertyName(() => lambda));
Console.WriteLine(" = {0}", ReflectionUtility.GetPropertyName(() => del));
Console.Write("Press any key to continue...");
Console.ReadKey();
}
输出
我认为这是不可能的。上面写着: 表达式树只是将表达式表示为数据结构。通过引用传递参数时,无法表示所需的特定内存位置
我认为这是不可能的。上面写着: 表达式树只是将表达式表示为数据结构。通过引用传递参数时,无法表示所需的特定内存位置
看起来一切都很好,除了如何提取方法名。试试这个:
public static string GetName<T>(Expression<T> field)
{
var callExpression = field.Body as MethodCallExpression;
return callExpression != null ? callExpression.Method.Name : string.Empty;
}
看起来一切都很好,除了如何提取方法名。试试这个:
public static string GetName<T>(Expression<T> field)
{
var callExpression = field.Body as MethodCallExpression;
return callExpression != null ? callExpression.Method.Name : string.Empty;
}
我正试图装的那个容器已经用完了。刷新页面。。我更新了问题。如您所见,我将其跟踪到调用调用并抛出异常的方法。似乎坚持在扩展到表达式。。。我可以试试。在那里捕捉一些东西,看看我是否能获得更多信息,但这并不重要,因为我只捕捉了一帧。关键是使用foo.GetName获取lambda/delegates内联和普通方法的方法名;如果只返回T=>callout T;在你的表达方法中没有其他东西了吗?GetCamera\uHwinfout obj会被填充。这种方法以前一直有效。类似地,现有代码在没有表达式的情况下工作。。仅将代表作为arg。然而,我把它们都包装好了,因为我在某个地方读到过,最好是有表达,并从中获得更多信息,而不仅仅是代表。。特别是兰姆达。”表达式树lambda不能包含out或ref参数“请查看我的问题的答案Hi Rohan,谢谢您的回答。”。我以前读过那篇文章。您可以看到我的代码可以正常工作,并在线程中执行您希望执行的操作。我担心无法从所有包装好的代码中获取调用方法/lambda的名称。我正在尝试填充的容器。刷新页面。。我更新了问题。如您所见,我将其跟踪到调用调用并抛出异常的方法。似乎坚持在扩展到表达式。。。我可以试试。在那里捕捉一些东西,看看我是否能获得更多信息,但这并不重要,因为我只捕捉了一帧。关键是使用foo.GetName获取lambda/delegates内联和普通方法的方法名;如果只返回T=>callout T;在你的表达方法中没有其他东西了吗?GetCamera\uHwinfout obj会被填充。这种方法以前一直有效。类似地,现有代码在没有表达式的情况下工作。。仅将代表作为arg。然而,我把它们都包装好了,因为我在某个地方读到过,最好是有表达,并从中获得更多信息,而不仅仅是代表。。特别是兰姆达。”表达式树lambda不能包含out或ref参数“请查看我的问题的答案Hi Rohan,谢谢您的回答。”。我以前读过那篇文章。您可以看到我的代码可以正常工作,并在线程中执行您希望执行的操作。我担心无法从所有包装好的代码中获得调用方法/lambda的名称。是的,我自己刚刚意识到了这一点。这更正了我的代码。因此,在我对表达式进行实验之后,它为字符串名提供了与我使用它们之前完全相同的返回值。运行时[b__2d]::00:00:03.53是为此特定lambda委托显示的内容。这能做到吗,我做错了什么,或者我需要把它字符串解析成我在事后所期望的样子吗?你是在呼叫一个nati吗
ve方法?看起来像某种运行时可调用的包装器。我正在内联调用本机方法和lambda委托。重点是将其中一个/或封装到表达式中,因为我认为这是我阅读的内容,以便能够获得方法本身的实际名称。事情是。。带有
public static string GetName<T>(Expression<T> field)
{
var callExpression = field.Body as MethodCallExpression;
return callExpression != null ? callExpression.Method.Name : string.Empty;
}