鉴于这个类
public class Foo
{
public string Name { get; set; }
}
这个方法(在其他类中)...
private Func<Foo, string> Compile(string body)
{
ParameterExpression prm = Expression.Parameter(typeof(Foo), "foo");
LambdaExpression exp = DynamicExpressionParser.ParseLambda(new[] { prm }, typeof(string), body);
return (Func<Foo, string>)exp.Compile();
}
会获取 lambda 表达式的右侧,并返回一个委托。因此,如果像这样调用它:
Foo f = new Foo { Name = "Hamilton Academicals" };
//foo => foo.Name.Substring(0,3)
Func<Foo, string> fn = Compile("foo.Name.Substring(0,3)");
string sub = fn(f);
那么sub的值将会是"Ham"。
一切都很好,但我想让Foo成为DynamicObject的子类(这样我就可以实现TryGetMember来动态地计算属性值),所以我想获取表达式的等效内容。
Func<dynamic, dynamic> fn = foo => foo.Name.Substring(0,3);
我尝试使用自定义的CallSiteBinder来使用Expression.Dynamic,但是当我尝试动态访问foo.Bar时出现“在类型Object中不存在属性或字段条款”。我认为这是因为需要动态分派对foo.Bar的调用才能获得,但这对我来说行不通,因为一个关键目标是让用户输入一个简单表达式并执行它。这可行吗?