1

少し動的な方法で Caliburn.Micro のナビゲーションを許可しようとしています (viewModels は設計時に認識されません)。

このコードは明らかに機能します

navigationService.UriFor<DatabasesViewModel>().Navigate();

ただし、私がやろうとしていることでは、ビューモデルを事前に知ることはできません。代わりに、ビュー モデルの Type のみを取得します。

リフレクションを使用してジェネリック メソッドを取得しようとしてきましたが、GetMethod または GetMethods を介して UriFor メソッドを取得できます。これをどのように達成できるかについてのアイデア。

4

1 に答える 1

1

あなたの問題は Caliburn.Micro に直接関係していませんが、C# でリフレクションを使用してジェネリック メソッドを呼び出す方法です。

SO については、すでにかなりの数の非常に良い質問があります: リフレクションを使用してジェネリック メソッドを呼び出すにはどうすればよいですか?

ただし、メソッドはクラスUriFor<T>の Caliburn によって拡張メソッドとして定義されているため、あなたのケースは少し特殊です。NavigationExtensions

したがって、いくつかの追加の手順が必要であり、NavigationExtensions呼び出す前にタイプから開始しNavigateます。

//Create the UriFor Method for your ViewModelType
var navigationExtension = typeof(NavigationExtensions);
var uriFor = navigationExtension.GetMethod("UriFor");
var genericUriFor = uriFor.MakeGenericMethod(yourViewModelType);

//Invoke UriFor: an instance of UriBuilder<T> is returned
var uriBuilder = genericUriFor.Invoke(null, new[] {navigationService});

//Create and Navigate on the returned uriBuilder
var navigateMethod = uriBuilder.GetType().GetMethod("Navigate");
navigateMethod.Invoke(uriBuilder, null);
于 2013-09-02T15:13:48.417 に答える