获取Expression <func <t>&gt; </func <t>的正文

时间:2015-02-18 12:25:12

标签: c# wpf func

在我的应用程序中,我有几个部分,我使用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);

1 个答案:

答案 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);
}