获取表达式正文<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);
}