3

此代码有效,但我想知道这是否是好的解决方案?这个使用表达式树的解决方案会被认为比 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);
4

1 回答 1

0

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

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

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

于 2013-04-20T11:17:55.030 回答