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

时间:2015-11-05 17:00:04

标签: c# xaml generics uwp

我目前正在开发一个UWP应用程序,其中我在PCL中使用self referencing generic type constraint

这里是对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>
{
  //...
}

然后,我有一个扩展班级App的班级MyApplication。 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中指定genereic类型,所以这里是根据this article的新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"
>

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

  <{1}}上的

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

     <{1}}上的

GenericArguments [0],T违反了System.Object类型的约束(文件HomePage.xaml)

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

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:9)

Given this answer (for Windows 8)以及您的结果,我认为我们可以放心地假设Windows 10中不支持XAML中的通用参数。

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

public abstract class BaseApp : MyApplication<B>
{        
}

然后让你的应用继承它:

sealed partial class App : BaseApp

相应地更改您的XAML:

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

很脏,但遗憾的是你无能为力。