Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带输出参数的Lambda泛型表达式_C#_Generics_Lambda_Expression Trees_Out - Fatal编程技术网

C# 带输出参数的Lambda泛型表达式

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是正确的,但由于它

我试图使用带有lambda委托的表达式来获取调用方法的名称,但它没有正确格式化

到目前为止,我的问题是。。对于lambda和常规方法,我如何获得与foo.Method.Name类似的期望值

到目前为止,我已经试过使用和不使用表达式。。得到同样的结果

b_uu2D

这是一个测试驱动程序,我可以在一个简单的例子中展示我所期望的。我需要支持的3种方法是:

Func FuncT foo 功能性T-foo 例如: Lambda表达式是无名的。它将显示类似于的内容

.Method.Name是正确的,但由于它是调用范围内其父方法的子方法,因此它实际上在堆栈上注册,如下所示:

b_uu2D

我读到我可能需要将它变成一个表达式,然后是表达式。编译以将其转换为动作,或者在我的例子中是Func

他们说如果没有一个编译的表达式,这可能是不可能的。。。也许这会帮助你向我解释我的代码在我试图做的事情中有点偏离

      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委托。重点是将其中一个/或封装到表达式中,因为我认为这是我阅读的内容,以便能够获得方法本身的实际名称。事情是。。带有的lambda方法将不起作用,因此假定分配给它的变量名可以打印。因为它现在已经包装好了,所以返回的是内部的under-the-hood变量名,而不是几个帧上的外部变量名。是的,我自己刚刚意识到了这一点。这更正了我的代码。因此,在我对表达式进行实验之后,它为字符串名提供了与我使用它们之前完全相同的返回值。运行时[b__2d]::00:00:03.53是为此特定lambda委托显示的内容。这甚至可以做到吗?我是否做错了什么,或者我是否需要将其字符串解析为事后所期望的形式?您是否正在调用本机方法?看起来像某种运行时可调用的包装器。我正在内联调用本机方法和lambda委托。重点是将其中一个/或封装到表达式中,因为我认为这是我阅读的内容,以便能够获得方法本身的实际名称。事情是。。带有的lambda方法将不起作用,因此假定分配给它的变量名可以打印。因为它现在已经包装好了,所以返回的是内部的under-the-hood变量名,而不是几个帧内的外部变量名。我有一个带out参数的lambda,如果您想测试它,它可以使用我提供的代码进行编译。至于另一个问题,是否只可能创建一个额外的参数,并使用我希望为lambda表达式命名的任何名称将其传播到底,或者将其转换为本机方法并仅使用method.name?在C中作为表达式树键入的lambda不能包含out或ref参数。它们也不能包含语句、流控制或C表达式类型子集以外的任何内容。然而,表达式树API System.Linq.Expressions确实支持更高级的构造,并且能够处理ref和out参数。不过,这是一种特殊情况,除了读取、写入和通过引用传递参数外,无法表示其他与地址相关的操作。@MikeStrobel感谢您的澄清。所以你必须手动操作,因为C不支持这种情况。我认为任何可能与反射或类似的BCEL。我有一个带out参数的lambda,如果您想测试它,它可以使用我提供的代码进行编译。至于另一个问题,是否只可能创建一个额外的参数,并使用我希望为lambda表达式命名的任何名称将其传播到底,或者将其转换为本机方法并仅使用method.name?在C中作为表达式树键入的lambda不能包含out或ref参数。它们也不能包含语句、流控制或C表达式类型子集以外的任何内容。然而,表达式树API System.Linq.Expressions确实支持更高级的构造,并且能够处理ref和out参数。不过,这是一种特殊情况,除了读取、写入和通过引用传递参数外,无法表示其他与地址相关的操作。@MikeStrobel感谢您的澄清。所以您必须手动执行,因为C不支持这种情况。
public static string GetName<T>(Expression<T> field)
{
    var callExpression = field.Body as MethodCallExpression;
    return callExpression != null ? callExpression.Method.Name : string.Empty;
}