Razor引擎在C#到VB.NET转换的动态/对象解析中失败
我正在尝试使用RazorEngine转换emailer类的C#实现,以解析razor模板,然后将电子邮件发送到VB.NET。这在C#中非常有效,但在将C#动态类型转换为VB.NET“object”类型时,我遇到了一些问题(从我所能看出,这是最接近的等效类型) 例如,这段代码在C#中工作得非常好: 在我转换到VB.NET的过程中,我最终得到了一个如下所示的函数调用:Razor引擎在C#到VB.NET转换的动态/对象解析中失败,c#,asp.net,.net,vb.net,razor,C#,Asp.net,.net,Vb.net,Razor,我正在尝试使用RazorEngine转换emailer类的C#实现,以解析razor模板,然后将电子邮件发送到VB.NET。这在C#中非常有效,但在将C#动态类型转换为VB.NET“object”类型时,我遇到了一些问题(从我所能看出,这是最接近的等效类型) 例如,这段代码在C#中工作得非常好: 在我转换到VB.NET的过程中,我最终得到了一个如下所示的函数调用: Private Shared Function RenderEmailBody(strTemplate As String, mod
Private Shared Function RenderEmailBody(strTemplate As String, model As Object) As String
Dim template As String = File.ReadAllText(strTemplate)
Dim body As String = Razor.Parse(template, model)
Return body
End Function
RenderEmailBody("mytemplate.vbhtml", New With { .Var1 = "1", .Var2 = "2" })
我对它的呼吁是这样的:
Private Shared Function RenderEmailBody(strTemplate As String, model As Object) As String
Dim template As String = File.ReadAllText(strTemplate)
Dim body As String = Razor.Parse(template, model)
Return body
End Function
RenderEmailBody("mytemplate.vbhtml", New With { .Var1 = "1", .Var2 = "2" })
但是,当我运行此操作时,会引发以下异常:
TemplateCompilationException was unhandled by user code
Unable to compile template. 'object' does not contain a definition for 'Var1' and no extension method 'Var1' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?)
当我在断点上检查model
时,它似乎正确地分配了Var1和Var2,但是当我调用Razor.Parse时,我不断地发现它不能正确解释我的动态对象
我在这里做错什么了吗?或者这两种类型之间存在固有的不兼容性?对象
和动态
是两种完全不同的东西。在VB的情况下,您所做的是完全取消模型的装箱。他们在C#中的dynamic关键字保留了实际的类型,而没有在设计时实际知道它。但是,当您以这种方式使用Object
时,将删除对该类型的所有实际引用。在本例中,您需要将模型重铸为其特定类型,才能访问.Var1
。最好的选择是调整方法调用的签名,使其具有您正在寻找的特定类型,或者使用通用模型可以实现的接口来定义.Var1
或.Var2
属性