我制作了一个生成异常的沙箱示例:
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属性。)
答案 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));