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

How can I determine the target type for a markup extension return value?

我正在编写自定义标记扩展。 在它的 ProvideValue method 中,我想 modify/convert 我的 return 值基于 属性 的预期目标类型,标记扩展被用来为其提供值。

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

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

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

使用 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 有类似的检查,参见 here and here - 如果有更好的 API,我想它会使用它。