如何动态创建表达式树的方法和属性?

时间:2013-04-20 10:06:16

标签: c#-4.0

此代码有效,但我想知道这是否是一个好的解决方案?使用表达式树的解决方案是否会被认为比Emit和OpCodes更好?

var target = Expression.Lambda(
            Expression.Block(
                new ParameterExpression[] { },
                Expression.Call(
                    typeof(MessageBox).GetMethod("Show", new[] { typeof(string) }),
                   Expression.Constant(1.ToString(), typeof(string))
                )
            ),
            new ParameterExpression[] { }

        );
AssemblyName aName = new AssemblyName("DynamicAssemblyExample");

AssemblyBuilder ab =
            AppDomain.CurrentDomain.DefineDynamicAssembly(
                aName,
                AssemblyBuilderAccess.RunAndSave);

        ModuleBuilder mb =
            ab.DefineDynamicModule(aName.Name, aName.Name + ".dll");
TypeBuilder tb = mb.DefineType("MyDynamicType", TypeAttributes.Public);
        var method = tb.DefineMethod("dynamicMethod", MethodAttributes.Public     |         MethodAttributes.Static);
target.CompileToMethod(method);

1 个答案:

答案 0 :(得分:0)

您示例中的代码似乎只是“示例”代码。我不认为它需要表达树。如果我正确读取它只是创建常量表达式() => MessageBox.Show(1.ToString());。)

当需要创建实际动态代码时,即在解释程序中的某些其他语言时,或者对于需要反射的操作时(例如,在Automapper等程序中),表达式树很棒。

它们是否比直接发射操作码更好。这真的取决于:能比编译器做得更好吗?发送操作码就像编写汇编一样,这很耗时,你真的需要知道你在做什么才能编写最佳代码。编译器和手动优化代码之间的性能差异值得付出额外的努力吗?