Razor 引擎动态模板模型成员

Razor Engine Dynamic Template Model Members

以下代码生成 "WTF??"

var t = @"@((Model.Type as Type == null)?""WTF??"":""Makes Sense"")";
var s = Engine.Razor.RunCompile(t, Guid.NewGuid().ToString(), null, new { Type = typeof(DateTime)});
Console.WriteLine(s);

Model.Type 似乎是 RazorDynamicObject 类型。如何安全地将其转换回类型?

谢谢!

我想你的意思是:

var t = @"@((typeof(Model.Type) as Type == null)?""WTF??"":""Makes Sense"")";
var s = Engine.Razor.RunCompile(t, Guid.NewGuid().ToString(), null, 
        new { Type = typeof(DateTime)});

Console.WriteLine(s);

Type 属性 将只是 return 模型的当前类型,而不是 Type 对象。

你不知道。这是一个奇怪的副作用,因为您从匿名 class 开始,它是内部的,需要包装。

RazorDynamicObject 再次包装所有调用,以便能够处理匿名类型的属性。 RazorDynamicObject 的设计方式使其甚至可以跨 Appdomains(隔离)工作。

如果您需要具体实例,则需要使用具体实例 class。也许应该有一个选项来禁用递归包装。如果您觉得需要该功能,请在 github RazorEngine 页面上提出问题。

编辑:从 3.6.2 开始不再如此。实际上,您现在可以通过转换为您的具体类型来转义此 RazorDynamicObject 包装器。有一些隐藏的场景我们会自动逃逸包装器(但我不会在这里详述)。请注意,现在应该 "just work".

Matthid,RazorEngine 贡献者。