我想将一些PageDefinitions传递给新的Windows RT页面。
PageDefinition:
class PageDefinition<T> where T: IItem { ... }
我这样传递:
rootFrame.Navigate(typeof(Overview), new PageDefinition<AnItem>)
然后在新页面中,我希望从我的论点中获取信息。页面的LoadState-Method预定义如下:
protected override void LoadState(Object navigationParameter, Dictionary<String, Object> pageState)
但是如何将navigationParameter转换回我原来的Type?我尝试了以下方法,但这不起作用(pageDefinition保持为null)
var pageDefinition = navigationParameter as PageDefinition<IItem>;
我不能退回原来的类型吗?
在我环顾四周但是找不到有用的东西时,谢谢你的帮助。
谢谢!
答案 0 :(得分:1)
正如Jim在评论中已经提到的那样,在您的问题中定义PageDefinition<T>
的C#中不允许进行以下演员:
var def = (PageDefinition<IItem>)new PageDefinition<AnItem>();
这需要将泛型类强制转换为具有较少派生泛型参数的泛型类。如果您将navigationParameter
转换为PageDefinition<AnItem>
,它将按预期工作。
或者,您可以利用对covariant generic interfaces的支持,并在您确实需要时进行转换。您需要声明(注意out
关键字):
interface IPageDefinition<out T> where T: IItem { }
然后:
class PageDefinition<T> : IPageDefinition<T> where T: IItem
执行此操作后,以下演员表将起作用:
var def = (IPageDefinition<IItem>)new PageDefinition<AnItem>();
界面中T的使用存在限制(基本上你只能将它用作返回类型),因此你必须检查是否可以让它适合你。详细信息在链接文章中进行了描述。