如何确定标记扩展返回值的目标类型?

时间:2019-03-15 17:18:44

标签: c# .net wpf xaml markup-extensions

我正在编写自定义标记扩展。 在其ProvideValue method中,我想根据标记扩展用来为其提供值的属性的预期目标类型来修改/转换我的返回值。

(基本上,TypeConverter知道其周围绑定的目标类型,并且可以相应地调整其行为;我想在标记扩展中做同样的事情。)

现在,ProvideValue方法仅接收IServiceProvider作为参数。 看来我应该能够使用它来获取一个为我提供所需的上下文信息的对象,但是到目前为止,我的尝试都没有一个完全令人满意:

  • 我已检索到IDestinationTypeProvider实现。不幸的是,尽管它看起来确实可以满足我的需要,但它却抛出了一个异常:

    var dtp = (IDestinationTypeProvider)serviceProvider.GetService(typeof(IDestinationTypeProvider));
    var destType = dtp.GetDestinationType(); // NullReferenceException on this line
    
  • 我已检索到IProvideValueTarget实现。它为我提供了目标属性,但仅作为System.Object,因此看来我必须自己准备代码以处理不同的(?)类型的属性并自己检索类型。

标记扩展获取其目标类型的预期方式是什么?

1 个答案:

答案 0 :(得分:1)

使用IServiceProvider给自己一个IProvideValueTarget,然后看看TargetProperty,它应该(但不能保证是)DependencyProperty

var provideValueTarget = (IProvideValueTarget)serviceProvider.GetService(typeof(IProvideValueTarget));
var propertyType = (provideValueTarget.TargetProperty as DependencyProperty)?.PropertyType;
// Test propertyType for null

如果MarkupExtension与事件一起使用,则目标属性也可能是EventInfo;如果它与附加事件一起使用,则目标属性也可能是MethodInfo(或者,正如您在注释中指出的那样, PropertyInfo(如果与常规属性一起使用)。

不幸的是,我认为这是唯一的方法。 DynamicResourceExtension进行了类似的检查,请参阅herehere-如果有更好的API,我认为它将使用它。