尝试使用ExpressionEvaluator库设置属性时获取System.ArgumentOutOfRangeException

时间:2014-11-20 22:08:44

标签: c#

我制作了一个生成异常的沙箱示例:

public class Account
{
    public string Status { get; set; }
}

[Fact]
public void MyTest()
{
    dynamic scope = new ExpandoObject();
    scope.Account = new Account();
    scope.Account.Status = "test0";

    // Can we get the value of the property?
    var result = new CompiledExpression("Account.Status").ScopeCompile().DynamicInvoke((object)scope);
    Assert.Same("test0", result); // Yes we can!

    // Can we set the value of the property?
    new CompiledExpression("Account.Status = 'test1'").ScopeCompile().DynamicInvoke((object)scope); // This throws an exception
    Assert.Same("test1", ((string)(scope.Account.Status)));
}

如果不清楚我有一个范围ExpandoObject,其属性不是动态的 - 而且我试图设置属性的属性(Status)( Account)通过解析表达式。 我做错了什么/为什么我在工作正常时会收到例外设置?

我正在使用这个库:

https://csharpeval.codeplex.com/

> Install-Package ExpressionEvaluator

或者,如果有更好的图书馆(我已经放弃了Simpro),请告诉我,我可以使用它。

(我使用xunit作为我的测试人员,但我认为不重要 - 因此[Fact]而不是MsTest属性。)

1 个答案:

答案 0 :(得分:0)

根据documentation for CompiledExpression,您需要为字符串文字使用单引号。所以,setter应该是:

new CompiledExpression("Account.Status = 'test1'").ScopeCompile()
    .DynamicInvoke((object)scope);

编辑:

我有这个工作:

var exp = new CompiledExpression("Status = 'test1'").ScopeCompile<Account>();
exp(scope.Account);

这也有效:

var x = new CompiledExpression("Status = 'test2'").ScopeCompile<Account>();
var y = new CompiledExpression("Account").ScopeCompile();
x(y(scope));