我需要創建一個調用動態對象的System.Linq.Expressions.Expression
。動態對象可以是ExpandoObject
或任何其他IDynamicMetaObjectProvider
。構建.NET表達式以調用動態對象的正確方法
考慮以下測試:
var myInstance = DateTime.Now;
var methodInfo = myInstance.GetType().GetMethod("ToUniversalTime");
var methodCallExpression = Expression.Call(Expression.Constant(myInstance), methodInfo);
var expression = Expression.Lambda(methodCallExpression);
Assert.AreEqual(myInstance.ToUniversalTime(), expression.Compile().DynamicInvoke());
我需要創建一個等效表達式時將myInstance被聲明等(只是作爲例子):
dynamic myInstance = new ExpandoObject();
myInstance.MyMethod = new Func<string>(() => "hello world");
我假設我需要使用Expression.Dynamic
方法(見MSDN)。但我不知道如何使用它。我試圖在谷歌搜索,但我發現使用Microsoft.CSharp.RuntimeBinder.Binder
班上唯一的例子(見MSDN)不能正式使用:
此API支持.NET Framework基礎結構,不適合使用直接從您的代碼。
使用Microsoft.CSharp.RuntimeBinder.Binder
我可以寫代碼如下:
dynamic myInstance = new ExpandoObject();
myInstance.MyMethod = new Func<string>(() => "hello world");
var binder = Binder.InvokeMember(
CSharpBinderFlags.None,
"MyMethod",
null,
this.GetType(),
new[] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.Constant, null) });
var methodCallExpression = Expression.Dynamic(binder, typeof(object), Expression.Constant(myInstance));
var expression = Expression.Lambda(methodCallExpression);
Assert.AreEqual(myInstance.MyMethod(), expression.Compile().DynamicInvoke());
它這個解決方案是否正確?
是的,這是我如何在CSharpEval中實現它 – EnderWiggin