此代码有效,但我想知道这是否是一个好的解决方案?使用表达式树的解决方案是否会被认为比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);
答案 0 :(得分:0)
您示例中的代码似乎只是“示例”代码。我不认为它需要表达树。如果我正确读取它只是创建常量表达式() => MessageBox.Show(1.ToString());
。)
当需要创建实际动态代码时,即在解释程序中的某些其他语言时,或者对于需要反射的操作时(例如,在Automapper等程序中),表达式树很棒。
它们是否比直接发射操作码更好。这真的取决于:能比编译器做得更好吗?发送操作码就像编写汇编一样,这很耗时,你真的需要知道你在做什么才能编写最佳代码。编译器和手动优化代码之间的性能差异值得付出额外的努力吗?