-1

我已经阅读了几篇与我的问题相关的帖子,但没有一篇能解决我的特定问题。

下面的类包含一些信息,这些信息将传递给 Razor 引擎进行解析。

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

ActionResult.ViewModel 属性将保存一个视图模型类的实例,该实例可以是我的视图所需的任何自定义类型,因为我的视图是强类型的。

我将更新剃须刀引擎。

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

然后调用一个渲染方法,它的签名是......

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

我面临的挑战是我不确定如何使用运行时可用的 actionResult 实例中的信息来调用此渲染方法。

如果我对方法进行硬编码,则调用它可以正常工作...

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

但我想我应该做的是将 actionResult.ViewModel 作为 MyViewModelType 或者只是将其转换为 MyViewModelType。但我不确定如何调用 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 回答