我有一个简单的类,其中包含一个属性。
class Foo
{
string Title { get; set; }
}
我试图通过调用函数来简化数据绑定。BindToText(titleTextBox, ()=>foo.Title );
这个变量的声明如下
void BindToText<T>(Control control, Expression<Func<T>> property)
{
var mex = property.Body as MemberExpression;
string name = mex.Member.Name;
control.DataBindings.Add("Text", ??? , name);
}
那么我在我的Foo
类实例中应该放什么?如何从lambda表达式中获取对调用的foo
实例的引用?
编辑:
实例应该在某个地方,因为我可以调用property.Compile()
并创建一个使用BindToText
函数内部的foo
实例的委托。所以我的问题是,是否可以在不将实例添加到函数参数中的情况下完成这项工作。 我依靠奥卡姆剃刀原理得出最简单的解决方案。
编辑2:
许多人没有注意到在编译lambda时访问foo
实例时存在的闭包。 编译器怎么知道在哪里找到实例,而我却不知道?我坚信必须有一个答案,无需传递额外的参数。
解决方案
感谢VirtualBlackFox,解决方法如下:
void BindText<T>(TextBoxBase text, Expression<Func<T>> property)
{
var mex = property.Body as MemberExpression;
string name = mex.Member.Name;
var fex = mex.Expression as MemberExpression;
var cex = fex.Expression as ConstantExpression;
var fld = fex.Member as FieldInfo;
var x = fld.GetValue(cex.Value);
text.DataBindings.Add("Text", x, name);
}
这使我可以简单地键入BindText(titleText, () => foo.Title);
。
constantInstanceExpression.Value
返回的是表单的实例,而不是表单中的字段foo
。如果表单中有几个用于绑定的类,怎么办?我不想静态地绑定到foo
,而是要绑定到属性中使用的任何内容。 - John Alexiou