我目前正在开发一个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)
根据这些问题,我需要在类App
和HomePage
的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],
<{1}}上的System.Object
违反了My.PCL.MyApplication'1[T]
类型的约束(文件App.xaml)GenericArguments [0],
T
违反了System.Object
类型的约束(文件HomePage.xaml)
你知道如何解决这个问题吗?
提前感谢您的帮助!
答案 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"
很脏,但遗憾的是你无能为力。