2013-03-02 100 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

相關問題