使用 IXamlTypeResolver 解析泛型类型
我编写了一个新的 TypeExtension 类来替换默认的 System.Windows.Markup.TypeExtension 来处理泛型类型。它允许 Xaml 以许多不同的方式使用泛型类型,例如:
<DataTemplate DataType="{ck:Type [here a generic type name]}">
这就是它的工作方式:
- 我编写了 TypeExtention 类,该类继承了 MarkupExtension(它是示例中的 ck:Type)
我会重写在 IXamlTypeResolver 上调用 Resolve 的 ProvideValue 方法
IXamlTypeResolver 服务 = p.GetService( true );
_type = service.Resolve( _typeName );
因此,在 .NET 3.5 中,我可以解析类似“local:IConfigItemProperty`1”的类型。但现在在 .NET 4(使用 WPF 4)中,resolve 方法会抛出异常:
字符串“local:IConfigItemProperty1”中存在意外字符“
”。 XAML 类型名称无效。
您认为 .NET 4.0 不再支持 '`' 了吗?
I'd written a new TypeExtension class that replace the default System.Windows.Markup.TypeExtension to handle generic types. It allows the Xaml to work with generic types in many different ways, like :
<DataTemplate DataType="{ck:Type [here a generic type name]}">
This is how it works :
- I'd written TypeExtention class, that inherit of MarkupExtension (it's the ck:Type in the example)
I'd override the ProvideValue method to call Resolve on IXamlTypeResolver
IXamlTypeResolver service = p.GetService( true );
_type = service.Resolve( _typeName );
So, in .NET 3.5, I can resolve types like "local:IConfigItemProperty`1". But now in .NET 4 (with WPF 4) the resolve method throws an exception :
Character '
' was unexpected in string 'local:IConfigItemProperty
1'. Invalid XAML type name.
Do you think .NET 4.0 does not support '`' anymore ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
虽然这篇文章有点旧,但我为任何其他正在寻找解决方案的开发人员提供了答案。
从 4.0 开始,他们似乎改变了 Reader 处理泛型的方式。 IXamlTypeResolver 服务缺乏对“”的支持似乎是一个错误,而回归根本没有记录。
如果您想使用泛型,您可能需要使用 x:TypeArguments 进行切换,它列出了泛型的参数。
C#
XAML
While the post is a bit old, i put the answer for any other dev looking for solution.
It's seem from 4.0 they change the way the Reader deal with generic. The lack of support to '`' by the IXamlTypeResolver service seem to be a bug while the regression is not documented at all.
If u want to use generic, you might want to switch with x:TypeArguments which is list the argument for the generic.
C#
XAML