如何确定标记扩展 return 值的目标类型?
How can I determine the target type for a markup extension return value?
我正在编写自定义标记扩展。
在它的 ProvideValue
method 中,我想 modify/convert 我的 return 值基于 属性 的预期目标类型,标记扩展被用来为其提供值。
(基本上,TypeConverter
知道其周围绑定的目标类型并可以相应地调整其行为;我想在我的标记扩展中做同样的事情。)
现在,ProvideValue
方法只接收一个 IServiceProvider
作为参数。
似乎我应该能够使用它来获得一个对象,该对象为我提供了所需的上下文信息,但到目前为止,none 我的尝试完全令人满意:
我已经检索到一个 IDestinationTypeProvider
实现。虽然根据它的名称,它似乎完全符合我的需要,但不幸的是,它抛出了一个异常:
var dtp = (IDestinationTypeProvider)serviceProvider.GetService(typeof(IDestinationTypeProvider));
var destType = dtp.GetDestinationType(); // NullReferenceException on this line
我已经检索到一个 IProvideValueTarget
实现。它为我提供了目标 属性,但仅作为 System.Object
,所以我似乎必须自己准备代码来处理不同的(?)种类的属性并自己检索类型。
标记扩展获取其目标类型的预期方式是什么?
使用 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,我想它会使用它。
我正在编写自定义标记扩展。
在它的 ProvideValue
method 中,我想 modify/convert 我的 return 值基于 属性 的预期目标类型,标记扩展被用来为其提供值。
(基本上,TypeConverter
知道其周围绑定的目标类型并可以相应地调整其行为;我想在我的标记扩展中做同样的事情。)
现在,ProvideValue
方法只接收一个 IServiceProvider
作为参数。
似乎我应该能够使用它来获得一个对象,该对象为我提供了所需的上下文信息,但到目前为止,none 我的尝试完全令人满意:
我已经检索到一个
IDestinationTypeProvider
实现。虽然根据它的名称,它似乎完全符合我的需要,但不幸的是,它抛出了一个异常:var dtp = (IDestinationTypeProvider)serviceProvider.GetService(typeof(IDestinationTypeProvider)); var destType = dtp.GetDestinationType(); // NullReferenceException on this line
我已经检索到一个
IProvideValueTarget
实现。它为我提供了目标 属性,但仅作为System.Object
,所以我似乎必须自己准备代码来处理不同的(?)种类的属性并自己检索类型。
标记扩展获取其目标类型的预期方式是什么?
使用 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,我想它会使用它。