从Object转换回Generic

时间:2013-03-02 10:32:56

标签: c# generics windows-runtime

我想将一些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>;

我不能退回原来的类型吗?

在我环顾四周但是找不到有用的东西时,谢谢你的帮助。

谢谢!

1 个答案:

答案 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的使用存在限制(基本上你只能将它用作返回类型),因此你必须检查是否可以让它适合你。详细信息在链接文章中进行了描述。