4

我正在尝试找出绑定表达式的源属性类型。我想这样做是因为我想使用UpdateSourceExceptionFilter来提供比一般的“无法转换”更有用的错误消息。

在 .NET 4.5 中,我使用ResolvedSourceResolvedSourcePropertyName与反射来获取源属性类型,如下所示:

PropertyInfo sourceProperty = expr.ResolvedSource.GetType().GetProperty(expr.ResolvedSourcePropertyName);
Type propertyType = sourceProperty.PropertyType;

这工作得很好。但是,这两个 BindingExpression 属性都是在 .NET 4.5 中引入的,而我仍在使用 4.0(由于 Windows XP,无法真正更新)。

那么在 .NET 4.0 中有没有很好的方法来做到这一点?我考虑过使用反射或仅使用私有来获取内部SourceItem和属性来获取这些值,但我宁愿避免访问内部/私有属性或字段(我认为这也需要我对信任做一些事情?有什么含义?)。SourcePropertyNameWorker

4

3 回答 3

5

不太漂亮,但无法访问私有方法:

string[] splits = expr.ParentBinding.Path.Path.Split('.');
Type type = expr.DataItem.GetType();
foreach (string split in splits) {
    type = type.GetProperty(split).PropertyType;
}

因此,我们能够解析源属性。

于 2013-05-21T18:04:26.823 回答
2

我在我的代码中使用它来查找源属性类型

        BindingExpression bindingExpression = BindingOperations.GetBindingExpression(this, SelectedItemProperty);
        object s = bindingExpression?.ResolvedSource;
        string pn = bindingExpression?.ResolvedSourcePropertyName;

        var type = s?.GetType().GetProperty(pn)?.PropertyType;
于 2019-01-13T00:49:47.357 回答
0

是一种独立于内部/私有 .NET 对象的解决方案。

属性expr.ResolvedSourcenullDataContext从父控件使用时,所以它不会有用。

查找源类型的原因是什么?

为什么不用简单String.Format("Binding has exception in path {0}", expr.ParentBinding.Path.Path?? String.Empty)

于 2013-05-22T03:20:36.337 回答