У меня есть простой класс с свойством
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
. Как получить ссылку на вызывающий экземпляр foo
из выражения лямбда?
edit: экземпляр должен быть где-то, потому что я могу вызвать property.Compile()
и создать делегат, который использует экземпляр foo
внутри моей функции BindToText
. Поэтому мой вопрос в том, можно ли это сделать без добавления ссылки на экземпляр в параметрах функции. Я призываю Occum Razor дать простейшее решение.
edit 2: Многие из них не заметили закрытие, которое существует при доступе к экземпляру 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);
,