剃刀引擎动态模板模型成员

时间:2015-02-12 22:48:15

标签: c# razorengine

以下代码生成" 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类型。如何将其安全地转换回类型?

谢谢!

2 个答案:

答案 0 :(得分:1)

我认为你的意思是:

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属性只返回模型的当前类型,而不是Type对象。

答案 1 :(得分:1)

你不是。这是一个奇怪的副作用,你从一个匿名类开始,这是一个内部的,需要被包装。

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

如果您需要具体实例,则需要使用具体类。也许应该有一个禁用递归包装的选项。如果您认为需要该功能,请在github RazorEngine页面上打开一个问题。

编辑:从3.6.2开始不再适用。实际上,您现在可以通过强制转换为具体类型来转义此RazorDynamicObject包装器。有一些隐藏的场景我们会自动转义包装器(但我不会在这里详细介绍)。请注意,现在这应该是#34;只是工作"。

Matthid,RazorEngine的贡献者。