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)中不存在
根据这些问题,我需要在类App
和HomePage
的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)的约束
你知道如何解决这个问题吗?
提前感谢您的帮助!
给出这个答案(对于Windows 8)和您的结果,我认为我们可以放心地假设XAML中的泛型参数在Windows 10中仍然不受支持。
作为一种变通方法,您可以在继承树中添加一个中间类来设置通用约束:
public abstract class BaseApp : MyApplication<B>
{
}
然后让你的应用程序从中继承:
sealed partial class App : BaseApp
并相应地更改XAML:
<local:BaseApp
x:Class="My.Project.App"
脏,但不幸的是,你对此无能为力。