在Expression.Call中显示FQN

时间:2014-04-24 10:32:16

标签: c# expression-trees

我正在尝试获取使用表达式树创建的静态方法调用的字符串表示形式。但是,文本表示不包含方法调用的FQN。下面给出的代码输出 TestMethod(),而不是我需要的 AnotherClass.TestMethod()

编辑:这只是一个简单的例子。最终输出可以是这样的: -

AnotherClass.TestMethod<Guid>("BLOB_DATA", new MyClass())

所以,我并不是想获取方法的FQN。根表达式对象甚至可能不是方法调用。我认为无论表达式有多复杂,执行ToString()都会返回可以表示它的C#代码。

目标是将根表达式转换为我可以使用的C#代码片段并在内存中进行编译。

using System;
using System.Linq.Expressions;
using System.Reflection;

namespace ExpressionTest
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            // Variant 1
            MethodCallExpression call = Expression.Call(typeof (AnotherClass), "TestMethod", Type.EmptyTypes);
            Console.WriteLine(call.ToString());

            // Variant 2
            MethodInfo method = typeof (AnotherClass).GetMethod("TestMethod");
            MethodCallExpression call2 = Expression.Call(method);
            Console.WriteLine(call2.ToString());

            Console.ReadLine();
        }
    }

    internal class AnotherClass
    {
        public static void TestMethod()
        {
        }
    }
}

1 个答案:

答案 0 :(得分:3)

string.Format("{0}.{1}", method.DeclaringType.Name, method.Name)

如果(最近编辑你的Q)你想把表达式变成可执行的东西,你可以改为:

Action compiled = Expression.Lambda<Action>(call2).Compile();

然后,您可以像调整任何其他Action

一样调用已编译的表达式