1

いくつかのPageDefinitionsを新しいWindowsRTページに渡したいです。

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を元のタイプに戻すにはどうすればよいですか?次のことを試しましたが、これは機能しません(pageDefinitionはnullのままです)

var pageDefinition = navigationParameter as PageDefinition<IItem>;

元のタイプにキャストバックできませんか?

私が周りを見回したので助けていただければ幸いですが、何か役立つものを見つけることができませんでした。

ありがとう!

4

1 に答える 1

1

ジムがコメントですでに述べたように、次のキャストはPageDefinition<T>、質問のように定義されているC#では許可されていません。

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

これには、ジェネリッククラスを、派生したジェネリック引数の少ないジェネリッククラスにキャストする必要があります。代わりににキャストするnavigationParameterと、期待どおりに機能します。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の使用には制限があります(基本的にはリターンタイプとしてのみ使用できます)。そのため、Tを機能させることができるかどうかを確認する必要があります。詳細はリンク先の記事に記載されています。

于 2013-03-03T11:42:52.133 に答える