在我的应用程序中,我有几个部分,我使用Expression<Func<T>>
。我用它来调用OnPropertyChanged
。例如,如果我有一个ObservableCollection<LogEntr>
我就像使用它一样:
public ObservableCollection<LogEntry> Level1Elements
{
get { return Get(() => Level1Elements); }
set { Set(() => Level1Elements, value); }
}
现在我想将此Expression<Func<ObservableCollection<LogEntry>>>>
传递给方法并访问ObservableCollection<LogEntry>
。有没有办法做到这一点,还是我必须传递“真正的”集合?
我有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);
但我希望有一种方法可以从Expression中提取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);
答案 0 :(得分:2)
假设这将始终用于当前对象的属性,下面应该可以工作 - 并且建立在你的评论中的基础之上:
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);
}