XAML 中的泛型

System.Xaml 中实现的 .NET XAML 服务支持使用泛型 CLR 类型。 此支持包括将泛型的约束指定为类型参数,并通过为泛型集合情况调用适当的 Add 方法来强制执行约束。 本主题介绍在 XAML 中使用和引用泛型类型的各个方面。

x:TypeArguments

x:TypeArguments 是由 XAML 语言定义的指令。 当它用作由泛型类型支持的 XAML 类型的成员时,x:TypeArguments 将泛型的约束类型参数传递给支持构造函数。 欲了解 x:TypeArguments 的 .NET XAML 服务用法的参考语法,包括语法示例,请参阅 x:TypeArguments 指令

由于 x:TypeArguments 采用字符串并且具有类型转换器支持,因此通常在 XAML 用法中声明为属性。

在 XAML 节点流中,x:TypeArguments 声明的信息可以从节点流中 StartObject 位置的 XamlType.TypeArguments 获取。 XamlType.TypeArguments 的返回值是 XamlType 值的列表。 可以通过调用 XamlType.IsGeneric 来确定 XAML 类型是否表示泛型类型。

XAML 中泛型的规则和语法约定

在 XAML 中,泛型类型必须始终表示为受约束的泛型。 不受约束的泛型永远不会出现在 XAML 类型系统或 XAML 节点流中,并且不能在 XAML 标记中表示。 对于泛型被 x:TypeArguments 引用的嵌套类型约束的情况,或 x:Type 为泛型类型提供 CLR 类型引用的情况,可以在 XAML 属性语法中引用泛型。 通过 .NET XAML 服务定义的 XamlTypeTypeConverter 类支持引用泛型。

XamlTypeTypeConverter 启用的 XAML 属性语法形式改变了使用尖括号表示泛型类型和约束的典型 MSIL/CLR 语法约定,而是用括号代替约束容器。 有关示例,请参阅 x:TypeArguments 指令

泛型和 XAML 2009 功能

如果使用 XAML 2009 而不是映射 CLR 基类型来获取常见语言基元的 XAML 类型,则可以使用 XAML 2009 内置类型作为 x:TypeArguments 中的信息项。 例如,可以声明以下内容(未显示前缀映射,但 x 是 XAML 2009 的 XAML 语言 XAML 命名空间):

<my:BusinessObject x:TypeArguments="x:String,x:Int32"/>

WPF 中的泛型支持

对于专门针对 WPF 的 XAML 2006 用法,还必须在与 x:TypeArguments 相同的元素上提供 x:Class,并且该元素必须是 XAML 文档中的根元素。 根元素必须映射到具有至少一个类型参数的泛型类型。 示例为 PageFunction<T>

支持泛型用法的可能解决方法包括定义一个可以返回泛型类型的自定义标记扩展,或者提供一个派生自泛型类型但在其自己的类定义中平展泛型约束的包装类定义。

在 WPF 中,可以将 XAML 2009 功能与 x:TypeArguments 一起使用,但仅适用于松散 XAML(未进行标记编译的 XAML)。 WPF 的已编译标记的 XAML 以及 XAML 的 BAML 形式当前不支持 XAML 2009 关键字和功能。

适用于 .NET Framework 3.5 的 Windows Workflow Foundation 中的自定义工作流不支持通用 XAML 用法。

另请参阅