0

RazorEngineを使用してEメールクラスのC#実装を変換し、Razorテンプレートを解析してから、VB.NETにEメールを送信しようとしています。これは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、動的オブジェクトが正しく解釈されないという問題が継続的に発生します。

私はここで何か間違ったことをしていますか?または、2つのタイプの間に固有の非互換性がありますか?

4

1 に答える 1

1

Objectdynamicは完全に別のものです。VBの場合、モデルを完全に箱から取り出します。C#の動的キーワードは、設計時に実際に(人間的に)知らなくても実際の型を保持します。ただし、Objectこの方法で使用すると、タイプへの実際の参照がすべて削除されます。この場合にアクセスするには、モデルを特定のタイプに再キャストする必要があります.Var1。最善の策は、メソッド呼び出しのシグネチャを調整して、探している特定のタイプにするか、.Var1または.Var2プロパティを定義する一般的なモデルで実装できるインターフェイスを使用することです。

于 2012-11-13T18:10:43.077 に答える