![](/img/trans.png)
[英]How to cast an Object (that is an Array) back to an Array (or something more generic)?
[英]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.