UWP应用程序中的自引用泛型类型约束和XAML

本文关键字:约束 XAML 泛型类型 自引用 应用程序 UWP | 更新日期: 2023-09-27 18:20:54

我目前正在开发一个UWP应用程序,在该应用程序中,我在PCL中使用自引用泛型类型约束。

这里是PCL类的描述。

首先,实现自引用泛型类型约束的类(该类还实现new()约束)

public abstract class A<T> 
  where T : A<T>, new()
{
  //...
}

然后,我有一个扩展Windows.UI.Xaml.Controls.Page类的基类:

public abstract class MyPage<T> : Page
  where T : A<T>, new()
{
  //...
}

我还有一个扩展Windows.UI.Xaml.Application类的基类:

public abstract class MyApplication<T> : Application
  where T : A<T>, new()
{
  //...
}

我的UWP类以以下方式扩展了上面描述的PCL的类。。。

首先,我有一个类B,它扩展了类A:

public sealed class B : A<B>
{
  //...
}

然后,我得到了扩展类MyApplication的类App。csharp文件:

public sealed partial class App : MyApplication<B>
{
  //...
}

和XAML文件:

<custom:MyApplication
  x:Class="My.Project.App"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:custom="using:My.PCL"
  RequestedTheme="Light"
/>

然后,我有一个HomePage,它扩展了类MyPage。csharp文件:

public sealed partial class HomePage : MyPage<B>
{
  //...
}

和XAML文件:

<custom:MyPage
  x:Class="My.Project.HomePage"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  xmlns:custom="using:My.PCL"
  mc:Ignorable="d"
>

当我试图编译时,我有以下错误(消息是法语的,我试图用英语翻译):

用于一般类型MyApp<T>需要类型1的参数(文件App.i.cs)

用于一般类型MyPage<T>需要类型1的参数(文件HomePage.i.cs)

名称MyApp不存在于命名空间using:My.PCL(文件App.xaml)中

名称MyPage在命名空间using:My.PCL(文件HomePage.xaml)中不存在

根据这些问题,我需要在类AppHomePage的XAML中指定generaeic类型,因此这里是根据本文创建的新XAML文件:

<custom:MyApplication
  x:Class="My.Project.App"
  x:TypeArguments="local:B"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:custom="using:My.PCL"
  xmlns:local="using:My.Project"
  RequestedTheme="Light"
/>

<custom:MyPage
  x:Class="My.Project.HomePage"
  x:TypeArguments="local:B"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  xmlns:custom="using:My.PCL"
  xmlns:local="using:My.Project"
  mc:Ignorable="d"
>

但它不起作用。我仍然有以前的错误。。。和新的:

My.PCL.MyApplication'1[T]上的GenericArguments[0],System.Object违反了类型T(文件App.xaml)的约束

My.PCL.MyPage'1[T]上的GenericArguments[0],System.Object违反了类型T(文件HomePage.xaml)的约束

你知道如何解决这个问题吗?

提前感谢您的帮助!

UWP应用程序中的自引用泛型类型约束和XAML

给出这个答案(对于Windows 8)和您的结果,我认为我们可以放心地假设XAML中的泛型参数在Windows 10中仍然不受支持。

作为一种变通方法,您可以在继承树中添加一个中间类来设置通用约束:

public abstract class BaseApp : MyApplication<B>
{        
}

然后让你的应用程序从中继承:

sealed partial class App : BaseApp

并相应地更改XAML:

<local:BaseApp
    x:Class="My.Project.App"

脏,但不幸的是,你对此无能为力。