获取表达式正文<Func<T>>
Get body of Expression<Func<T>>
在我的应用程序中,我有几个部分使用了 Expression<Func<T>>
。我用它来调用 OnPropertyChanged
。例如,如果我有一个 ObservableCollection<LogEntr>
,我会像这样使用它:
public ObservableCollection<LogEntry> Level1Elements
{
get { return Get(() => Level1Elements); }
set { Set(() => Level1Elements, value); }
}
现在我想将此 Expression<Func<ObservableCollection<LogEntry>>>>
传递给方法并访问 ObservableCollection<LogEntry>
。有没有办法做到这一点,还是我必须通过 "real" 集合?
我有一个 ObservableCollection
(ExtendedObservableCollection) 的自定义实现。我可以在那里调用 AddItems 并传递 IList
。在调用 AddItems 之后,我必须调用 OnPropertyChanged(() => Level1Elements);
所以每次我想向 ExtendedObservableCollection
添加项目时,我都必须调用:
Collection.AddItems(newItems);
OnPropertyChanged(() => Collection);
现在我想把它封装成一个方法。目前该方法如下所示:
private void AddItemsToCollectionAndInvokePropertyChanged<T,U>(ExtendedObservableCollection<T> collection, IList<T> addItems, Expression<Func<U>> propertyNameExpression)
{
collection.AddItems(addItems);
OnPropertyChanged(propertyNameExpression);
}
这个调用现在看起来像:
AddItemsToCollectionAndInvokePropertyChanged(Level1Elements, output.Levels, () => Level1Elements);
但我希望有一种方法可以从表达式中提取 Level1Elements-ExtendedObservableCollection。
最终解:
private void AITCAIPC<T, U>(Expression<Func<U>> expression, IList<T> addItems)
where U : ExtendedObservableCollection<T>
{
PropertyInfo propertyInfo = (PropertyInfo)((MemberExpression)expression.Body).Member;
U u = (U)propertyInfo.GetValue(this, null);
u.AddItems(addItems);
OnPropertyChanged(expression);
}
电话现在看起来像:
AITCAIPC(() => Level1Elements, output.Levels);
假设这将始终用于当前对象的属性,下面应该可以工作 - 并建立在您评论中的内容之上:
private void AddItemsToCollectionAndInvokePropertyChanged<T,U>(Expression<Func<U>> propertyNameExpression, IList<T> addItems)
{
var p = (PropertyInfo)((MemberExpression)propertyNameExpression.Body).Member;
var c = (ExtendedObservableCollection<T>)p.GetValue(this, null);
c.AddItems(addItems);
OnPropertyChanged(propertyNameExpression);
}
在我的应用程序中,我有几个部分使用了 Expression<Func<T>>
。我用它来调用 OnPropertyChanged
。例如,如果我有一个 ObservableCollection<LogEntr>
,我会像这样使用它:
public ObservableCollection<LogEntry> Level1Elements
{
get { return Get(() => Level1Elements); }
set { Set(() => Level1Elements, value); }
}
现在我想将此 Expression<Func<ObservableCollection<LogEntry>>>>
传递给方法并访问 ObservableCollection<LogEntry>
。有没有办法做到这一点,还是我必须通过 "real" 集合?
我有一个 ObservableCollection
(ExtendedObservableCollection) 的自定义实现。我可以在那里调用 AddItems 并传递 IList
。在调用 AddItems 之后,我必须调用 OnPropertyChanged(() => Level1Elements);
所以每次我想向 ExtendedObservableCollection
添加项目时,我都必须调用:
Collection.AddItems(newItems);
OnPropertyChanged(() => Collection);
现在我想把它封装成一个方法。目前该方法如下所示:
private void AddItemsToCollectionAndInvokePropertyChanged<T,U>(ExtendedObservableCollection<T> collection, IList<T> addItems, Expression<Func<U>> propertyNameExpression)
{
collection.AddItems(addItems);
OnPropertyChanged(propertyNameExpression);
}
这个调用现在看起来像:
AddItemsToCollectionAndInvokePropertyChanged(Level1Elements, output.Levels, () => Level1Elements);
但我希望有一种方法可以从表达式中提取 Level1Elements-ExtendedObservableCollection。
最终解:
private void AITCAIPC<T, U>(Expression<Func<U>> expression, IList<T> addItems)
where U : ExtendedObservableCollection<T>
{
PropertyInfo propertyInfo = (PropertyInfo)((MemberExpression)expression.Body).Member;
U u = (U)propertyInfo.GetValue(this, null);
u.AddItems(addItems);
OnPropertyChanged(expression);
}
电话现在看起来像:
AITCAIPC(() => Level1Elements, output.Levels);
假设这将始终用于当前对象的属性,下面应该可以工作 - 并建立在您评论中的内容之上:
private void AddItemsToCollectionAndInvokePropertyChanged<T,U>(Expression<Func<U>> propertyNameExpression, IList<T> addItems)
{
var p = (PropertyInfo)((MemberExpression)propertyNameExpression.Body).Member;
var c = (ExtendedObservableCollection<T>)p.GetValue(this, null);
c.AddItems(addItems);
OnPropertyChanged(propertyNameExpression);
}