1

我想将一些 PageDefinitions 传递给一个新的 Windows RT 页面。

页面定义:

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 转换回我的原始类型?我尝试了以下方法,但这不起作用(pageDefinition 保持为空)

var pageDefinition = navigationParameter as PageDefinition<IItem>;

我不能转换回原来的类型吗?

当我环顾四周但找不到有用的东西时,感谢您的帮助。

谢谢!

4

1 回答 1

1

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

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

这将需要将泛型类强制转换为具有较少派生泛型参数的泛型类。如果您navigationParameter改为使用 to 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 是有限制的(基本上你只能将它用作返回类型),所以你必须检查你是否可以让它为你工作。链接文章中描述了详细信息。

于 2013-03-03T11:42:52.133 回答