【发布时间】:2011-07-02 19:39:42
【问题描述】:
我有一个带有属性的简单类
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 实例的委托。所以我的问题是,如果不在函数参数中添加对实例的引用,是否可以做到这一点。我呼吁Occum's Razor 提供最简单的解决方案。
编辑 2:
许多人没有注意到的是 closure 存在于访问我的函数内部的 foo 的实例,如果我编译 lambda。为什么编译器知道在哪里可以找到实例,而我却不知道?我坚持必须有一个答案, 不必传递额外的参数。
解决方案
感谢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);。
【问题讨论】:
标签: c# data-binding .net-3.5 expression-trees lambda