У меня есть простой класс со свойством
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
.Поэтому мой вопрос заключается в том, можно ли это сделать без добавления ссылки на экземпляр в параметрах функции.Я призываю Бритва Оккума найти простейшее решение.
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);
.