-1

私の質問に関連するいくつかの投稿を読みましたが、特定の問題に対処するものはありません。

以下のクラスは、解析のために Razor エンジンに渡される情報を取得する情報を保持します。

public class ActionResult
{
    public object ViewModel { get; set; }
    public string View { get; set; }
}

ActionResult.ViewModel プロパティは、ビューが厳密に型指定されているため、ビューが必要とする任意のカスタム タイプのビュー モデル クラスのインスタンスを保持します。

かみそりエンジンを新調します。

var razorEngine = new RazorEngine(razorScriptFile, _moduleResult.ModuleContext, "");

次にrenderメソッドを呼び出します。そのシグネチャは...

public void Render<T>(TextWriter writer, T model){}

私が抱えている課題は、実行時に利用可能な actionResult インスタンス内の情報を使用して、この render メソッドを呼び出す方法がわからないことです。

メソッド呼び出しをハードコーディングすると、正常に動作します...

razorEngine.Render<MyViewModelType>(writer, actionResult.ViewModel);

しかし、私がすべきことは、actionResult.ViewModel を MyViewModelType として取得するか、MyViewModelType にキャストすることだと思います。しかし、実行時に Type を提供しながら razorEngine.Render() メソッドを呼び出す方法がわかりません。

.Net 4.5を使用

編集...

私ができると思ったのは..

Type type = actionResult.ViewModel.GetType();
var model = actionResult.ViewModel as type;

しかし、これは機能しません

4

1 に答える 1

1

リフレクションを使用して、必要なものを実現できます。

var viewModel = actionResult.ViewModel;
var method = typeof (RazorEngine).GetMethod("Render").
    MakeGenericMethod(viewModel.GetType());
method.Invoke(razorEngine, new[] {writer, viewModel});

しかし、コメントが正当に述べているように、なぜ希望の型にキャストできないのでしょviewModelうか?

編集: の他のオーバーロードRenderは非ジェネリックのみであるRender(TextWriter)ため、次のコードを使用できます。

var method = typeof (RazorEngine).GetMethods().
    Single(m => m.Name == "Render" && m.ContainsGenericParameters).
    MakeGenericMethod(viewModel.GetType());

ただし、追加のチェックを追加して、コードをより安全にすることをお勧めします。新しいバージョンRenderでジェネリック パラメーターを使用した新しいオーバーロードを取得すると、上記のコードは例外をスローします。Firstの代わりに使用Singleできますが、上記のようにライブラリが更新された場合、コードにバグが発生する可能性があります。

于 2013-01-06T16:56:09.243 に答える