1

Orchard カスタム モジュールのコーディングに役立つ DSL を開発しました。生成されたドライバーの Editor メソッドでは、部分的なメソッドを使用して、プログラマーが必要に応じて生成されたコードの動作をオーバーライドできるようにしています。

ただし、実行時に、部分メソッドが実装されていないという例外が発生します。

A first chance exception of type 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' occurred in Microsoft.CSharp.dll

Additional information: 'MyModule.Drivers.CompanyPartDriver' does not contain a definition for 'CustomEditorGet'

C# の仕様によると、そうである必要はないので、動的コンパイル (またはそのようなもの) がここで邪魔になっているのではないかと考えています。コードは実行およびデバッグの前に手動でコンパイルされるため、実行時にコンパイルする必要があるコードは存在しないことに注意してください。

問題のビットは次のとおりです。

public partial class CompanyPartDriver : ContentPartDriver<CompanyPart>
{
   // other code

   partial void CustomEditorGet(CompanyPart part, dynamic shapeHelper, ref DriverResult result);

   protected override DriverResult Editor(CompanyPart part, dynamic shapeHelper)
   {
      DriverResult result;

      if (AdminFilter.IsApplied(HttpContext.Current.Request.RequestContext))
         result = ContentShape("Parts_CompanyAdmin_Edit",
                               () => shapeHelper.EditorTemplate(TemplateName: "Parts/CompanyAdmin",
                                                                Model: part,
                                                                Prefix: Prefix));
      else
         result = ContentShape("Parts_Company_Edit",
                               () => shapeHelper.EditorTemplate(TemplateName: "Parts/Company",
                                                                Model: part,
                                                                Prefix: Prefix));


      CustomEditorGet(part, shapeHelper, ref result);

      return result;
   }

   // other code
}

空であっても、別のファイルの部分クラスに「CustomEditorGet」メソッドの実装を追加すると、すべて問題ありません。部分メソッド impl なしで部分クラスを追加するだけでは修正されません。

何かご意見は?

4

2 に答える 2