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

C# 如何确定标记扩展返回值的目标类型?,c#,.net,wpf,xaml,markup-extensions,C#,.net,Wpf,Xaml,Markup Extensions,我正在编写一个自定义标记扩展。 在its中,我希望根据标记扩展用于为其提供值的属性的预期目标类型修改/转换返回值 (基本上,a知道其周围绑定的目标类型,并可以相应地调整其行为;我希望在标记扩展中也这样做。) 现在,ProvideValue方法只接收作为参数的。 似乎我应该能够使用它来获取一个对象,该对象为我提供所需的上下文信息,但到目前为止,我的尝试都没有完全令人满意: 我已检索到一个IDestinationTypeProvider实现。虽然它看起来完全符合我的需要,但基于它的名称,不幸的是,

我正在编写一个自定义标记扩展。 在its中,我希望根据标记扩展用于为其提供值的属性的预期目标类型修改/转换返回值

(基本上,a知道其周围绑定的目标类型,并可以相应地调整其行为;我希望在标记扩展中也这样做。)

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

  • 我已检索到一个
    IDestinationTypeProvider
    实现。虽然它看起来完全符合我的需要,但基于它的名称,不幸的是,它抛出了一个异常:

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


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

使用
IServiceProvider
获取自己的
IProviderValueTarget
,然后查看
TargetProperty
,它应该(但不保证)是
从属属性

var provideValueTarget = (IProvideValueTarget)serviceProvider.GetService(typeof(IProvideValueTarget));
var propertyType = (provideValueTarget.TargetProperty as DependencyProperty)?.PropertyType;
// Test propertyType for null
如果标记扩展名与事件一起使用,则目标属性也可能是
EventInfo
;如果标记扩展名与附加事件一起使用,则目标属性可能是
MethodInfo
(或者,正如您在注释中指出的,如果标记扩展名与普通属性一起使用,则目标属性可能是
PropertyInfo


不幸的是,我认为这是唯一的办法
DynamicResourceExtension
有类似的检查,请参阅和-如果有更好的API,我想它会使用它。

或者
PropertyInfo
如果标记扩展用于普通(非依赖性)属性。或者在框架的未来版本中完全其他的东西。这正是我希望BCL能让我省掉的,但如果这确实是唯一的办法,我会在稍后接受这个答案。@O.R.Mapper我相当肯定这是唯一的办法。我添加了一些WPF代码的链接,这些代码执行相同的检查。如果你能找到更好的方法,我会很高兴的!