Asp.net 运行时强制转换

Asp.net 运行时强制转换,asp.net,razor,Asp.net,Razor,我读过几篇与我的问题相关的帖子,但没有一篇涉及我的具体问题 下面的类保存一些信息,这些信息将被传递给Razor引擎进行解析 public class ActionResult { public object ViewModel { get; set; } public string View { get; set; } } ActionResult.ViewModel属性将保存视图模型类的实例,该类可以是视图所需的任何自定义类型,因为我的视图是强类型的 我要把剃须刀的引擎换新

我读过几篇与我的问题相关的帖子,但没有一篇涉及我的具体问题

下面的类保存一些信息,这些信息将被传递给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){}

但这不起作用

您可以使用反射来实现所需:

var viewModel = actionResult.ViewModel;
var method = typeof (RazorEngine).GetMethod("Render").
    MakeGenericMethod(viewModel.GetType());
method.Invoke(razorEngine, new[] {writer, viewModel});
但是正如这些评论正确地指出的那样,为什么您不能将
viewModel
转换为您想要的类型

编辑:由于
渲染
的唯一其他重载是非通用的
渲染(TextWriter)
,因此可以使用以下代码:

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

但是,我建议您通过添加额外的检查来提高代码的安全性。如果在新版本的
Render
中,使用泛型参数获取新重载,则上述代码将引发异常。您可以先使用
而不是
单个
,但如果如上所述,库得到更新,则可能会在代码中产生错误。

您需要使用反射,或者只传递对象。razorEngine.Render(writer,(MyViewModelType)actionResult.ViewModel有什么问题吗?我不确定我是否理解困难所在。在razor引擎上调用render方法时,模型参数的类型必须与razor视图的类型相同。我想我的缺点是如何在运行时将模型从对象类型强制转换为所需的自定义类型(MyViewModel)。@SLaks我只是将模型作为对象传递,但RazorEngine内部不喜欢这样,我解析的razor视图的模型最终为空。RazorEngine类位于一个库中,该库是另一个dll的一部分,我不能修改。我同意,为什么我不能?所需的类型是在运行时确定的,那么正确执行此操作的语法或表达式是什么呢?如果
viewModel
的实际类型是在运行时确定的(根据您最初的问题,我以为您只是想将其预定类型传递给泛型方法),那么我的问题中提供的方法对你有效。所以我必须使用反射来实现这一点?@JBeckton是的,你可能还想缓存结果或以某种方式封装它们,这样你就不必使用大量的反射代码。反射有点棘手,我一直收到一个错误“找到了不明确的匹配”因为我在这个类上有两个Render方法。
var viewModel = actionResult.ViewModel;
var method = typeof (RazorEngine).GetMethod("Render").
    MakeGenericMethod(viewModel.GetType());
method.Invoke(razorEngine, new[] {writer, viewModel});
var method = typeof (RazorEngine).GetMethods().
    Single(m => m.Name == "Render" && m.ContainsGenericParameters).
    MakeGenericMethod(viewModel.GetType());