0

我正在尝试使用 RazorEngine 转换电子邮件类的 C# 实现来解析剃刀模板,然后将电子邮件发送到 VB.NET。这在 C# 中效果很好,但是我遇到了将 C# 动态类型转换为 VB.NET“对象”类型的问题(据我所知,这是最接近的等价物)。

例如,这段代码在 C# 中运行良好:

public static string GetEmailBody(string templatePath, dynamic model)
{
      var template = File.ReadAllText(templatePath);
      var body = Razor.Parse(template, model);
      return body;
}

在我转换到 VB.NET 时,我得到了一个如下所示的函数调用:

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我不断遇到问题,它无法正确解释我的动态对象。

我在这里做错了什么吗?还是这两种类型之间存在固有的不兼容?

4

1 回答 1

1

Object并且dynamic是两个完全不同的东西。在 VB 案例中,您所做的是完全拆箱模型。它们在 C# 中的 dynamic 关键字保留了实际类型,而在设计时实际上并不知道它(人为地)。但是,当您Object以这种方式使用时,您会删除对该类型的所有实际引用。.Var1在这种情况下,您需要将模型重新转换为特定类型才能访问。您最好的选择是调整方法调用的签名以具有您正在寻找的特定类型,或者使用您的通用模型可以实现的定义.Var1or.Var2属性的接口。

于 2012-11-13T18:10:43.077 回答