c# - 如何确定标记扩展返回值的目标类型?
问题描述
我正在编写一个自定义标记扩展。在它的ProvideValue
方法中,我想根据标记扩展用于为其提供值的属性的预期目标类型来修改/转换我的返回值。
(基本上,aTypeConverter
知道其周围绑定的目标类型,并可以相应地调整其行为;我想在我的标记扩展中做同样的事情。)
现在,该ProvideValue
方法只接收一个IServiceProvider
作为参数。看来我应该能够使用它来获取一个对象,该对象为我提供所需的上下文信息,但到目前为止,我的尝试都没有完全令人满意:
我已经检索了一个
IDestinationTypeProvider
实现。虽然它似乎完全符合我的需要,但不幸的是,根据它的名称,它抛出了一个异常:var dtp = (IDestinationTypeProvider)serviceProvider.GetService(typeof(IDestinationTypeProvider)); var destType = dtp.GetDestinationType(); // NullReferenceException on this line
我已经检索了一个
IProvideValueTarget
实现。它为我提供了目标属性,但仅作为 aSystem.Object
,所以看来我必须自己准备代码以处理不同的(?)类型的属性并自己检索类型。
标记扩展获取其目标类型的预期方式是什么?
解决方案
使用IServiceProvider
让自己成为IProvideValueTarget
,然后查看TargetProperty
,应该(但不保证)是DependencyProperty
。
var provideValueTarget = (IProvideValueTarget)serviceProvider.GetService(typeof(IProvideValueTarget));
var propertyType = (provideValueTarget.TargetProperty as DependencyProperty)?.PropertyType;
// Test propertyType for null
EventInfo
如果 MarkupExtension 与事件一起使用,目标属性也可能是一个,或者MethodInfo
如果它与附加事件一起使用(或者,正如您在评论中指出的,PropertyInfo
如果它与普通属性一起使用)。
不幸的是,我认为这是这样做的唯一方法。DynamicResourceExtension
有类似的检查,请参见此处和此处- 如果有更好的 API,我认为它会使用它。
推荐阅读
- reactjs - 如何在 useEffect 向 Reactjs 应用程序添加新的 HTML?
- c++ - 为什么 std::map::erase 返回 int 而不是 bool?
- python - 我的代码删除了列表中的最后一项,而不是我想要的项目
- javascript - 无法从 TMDB 获取成人或非数据属性
- php - foreach 在 1 次迭代后停止运行
- ansible - 如何使用 ansible-galaxy 命令列出 Ansible Galaxy 角色的版本?
- php - 当我使用 return back() 时,出现错误
- reporting-services - MDX:如何为每个元组添加一个度量,然后如何获得这个度量
- spring-boot - 为不同环境创建图像的最佳方法
- javascript - 找不到替换的请留下原信