繁体   English   中英

从对象转换回通用

[英]Cast from Object back to Generic

我想将一些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保持为空)

var pageDefinition = navigationParameter as PageDefinition<IItem>;

我不能从原始类型退回吗?

当我环顾四周,但找不到有用的信息时,我们将不胜感激。

谢谢!

正如Jim在评论中已经提到的那样,在C#中不允许使用以下定义的PageDefinition<T>如您的问题中定义的PageDefinition<T>

var def = (PageDefinition<IItem>)new PageDefinition<AnItem>();

这将需要将通用类转换为具有较少派生通用参数的通用类。 如果将您的navigationParameter PageDefinition<AnItem>PageDefinition<AnItem> ,它将按预期工作。

另外,您可以利用对协变通用接口的支持,并在真正需要时进行转换。 您需要声明(注意out关键字):

interface IPageDefinition<out T> where T: IItem { }

接着:

class PageDefinition<T> : IPageDefinition<T> where T: IItem

完成此操作后,以下强制转换将起作用:

var def = (IPageDefinition<IItem>)new PageDefinition<AnItem>();

接口中T的用法受到限制(基本上,您只能将其用作返回类型),因此您必须检查是否可以使其适合您。 详细信息在链接的文章中进行了描述。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM