2013-03-02 105 views
1

我想将一些PageDefinitions传递给一个新的Windows RT页面。从Object转换回Generic

的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>; 

我不能从原始类型投退?

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

谢谢!

+0

请注意,as运算符仅执行引用转换和装箱转换。as运算符不能执行其他转换,例如用户定义的转换,而应该使用转换表达式来执行其他转换。请参阅:http://msdn.microsoft.com/de-de/library/vstudio/cscsdfbt.aspx – 2013-03-02 11:21:35

+0

我现在这样做: Type type = navigationParameter.GetType(); this.DefaultViewModel [“Groups”] = type.GetRuntimeProperty(“Groups”)。GetValue(navigationParameter); =>绝对不是一个干净的方式,甚至不知道是否允许在Windows Store应用程序中使用反射:(还在听你tipps! – landi 2013-03-02 11:51:00

+0

PageDefinition 是不是你的原始类型,PageDefinition 是,并且这将工作。您将您的var pageDefinition更改为PageDefinition 您还会看到一个转场异常。 – 2013-03-02 19:02:44

回答

1

吉姆在注释中已经提到,下面的投没有在C#允许与PageDefinition<T>被定义为你的问题:

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(基本上你只能用它作为返回类型),所以你必须检查是否可以使它适合你。详细信息在链接的文章中描述。

+0

感谢您的支持,似乎是我需要的!我会尽力实现它,然后回到你身边!提前致谢! – landi 2013-03-04 12:51:31

相关问题