使用 IXamlTypeResolver 解析泛型类型

发布于 2024-12-06 20:35:08 字数 729 浏览 0 评论 0原文

我编写了一个新的 TypeExtension 类来替换默认的 System.Windows.Markup.TypeExtension 来处理泛型类型。它允许 Xaml 以许多不同的方式使用泛型类型,例如:

<DataTemplate DataType="{ck:Type [here a generic type name]}">

这就是它的工作方式:

  1. 我编写了 TypeExtention 类,该类继承了 MarkupExtension(它是示例中的 ck:Type)
  2. 我会重写在 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 :

  1. I'd written TypeExtention class, that inherit of MarkupExtension (it's the ck:Type in the example)
  2. 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:IConfigItemProperty1'. Invalid XAML type name.

Do you think .NET 4.0 does not support '`' anymore ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

此刻的回忆 2024-12-13 20:35:08

虽然这篇文章有点旧,但我为任何其他正在寻找解决方案的开发人员提供了答案。
从 4.0 开始,他们似乎改变了 Reader 处理泛型的方式。 IXamlTypeResolver 服务缺乏对“”的支持似乎是一个错误,而回归根本没有记录。
如果您想使用泛型,您可能需要使用 x:TypeArguments 进行切换,它列出了泛型的参数。

C#

public class GraphBase<N,L,P> : IGraph<N,L,P>
{
...
}

XAML

<?xml version="1.0" encoding="utf-8" ?>
<GraphBase
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       xmlns="clr-namespace:MyGeoLive.Topology;assembly=MyGeoLive.Topology"
       xmlns:System="clr-namespace:System;assembly=mscorlib"
       x:TypeArguments="System:String,System:String,System:String" >

</GraphBase>  

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#

public class GraphBase<N,L,P> : IGraph<N,L,P>
{
...
}

XAML

<?xml version="1.0" encoding="utf-8" ?>
<GraphBase
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       xmlns="clr-namespace:MyGeoLive.Topology;assembly=MyGeoLive.Topology"
       xmlns:System="clr-namespace:System;assembly=mscorlib"
       x:TypeArguments="System:String,System:String,System:String" >

</GraphBase>  
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文