如何在没有DynamicInvoke的情况下编译MethodCallExpression?

时间:2013-10-29 18:24:19

标签: c# ios lambda xamarin

我有MethodCallExpression,其中包含日期调用,如此

DateTime.UtcNow.AddDays(-10);

我希望能够将其编译为它所代表的实际日期,但由于我使用的是Xamarin,并且为iOS构建,我无法使用DynamicInvoke()方法由于AOT编译限制。

var expression = MyExpression;
if (expression.Type.Name == "DateTime")
{
    // Can't do this. Even though it works in most cases
    string result = Expression.Lambda( expression ).Compile().DynamicInvoke();
}

2 个答案:

答案 0 :(得分:1)

所以,经过一些研究后我可以看出......没有办法在ExpressionVisitor中进行编译,只是因为它需要进行即时编译,这在iOS上是不允许的。

我们的另一种选择是接受此作为限制,并更改我们的查询。

var date = DateTime.UtcNow.AddDays(-10);
var actualExpression = TestExpression<UserModel>( u => u.CreatedDate == date );

现在我们在将代码传递到表达式树之前预先编译代码。

答案 1 :(得分:0)

AFAIK - 由于iOS上的limitations动态代码生成,您无法执行编译。你唯一的选择是某种翻译(也许是PaxScript?)

更新:paxScript页面显示该代码与Mono for Android兼容。尝试与WinRT和WP7 / 8兼容的版本。这些平台对iOS有类似的限制。