Orchard自定义模块中的部分方法

时间:2014-08-20 21:23:45

标签: c# orchardcms orchardcms-1.8 orchard-modules partial-methods

我们开发了一个DSL来帮助编写Orchard自定义模块。在生成的驱动程序的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的分部类不会修复它。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

(我希望有人愿意提供更准确的答案。)

看起来你已经遇到了一个糟糕的&#34;部分方法和dynamic论证的混合。

使用partial void方法,其中没有&#34; part&#34; partial class提供了一个实现,partial void方法被视为&#34;不存在&#34;在编译时,它实际上并没有在IL中实现。

使用调用CustomEditorGet(part, shapeHelper, ref result);,其中第二个参数是编译时类型dynamic的表达式,我们&#34; bind&#34;到一个不存在的方法。通常,当不涉及dynamic时,整个呼叫/调用被删除&#34;在编译时。但是因为这是一个dynamic表达式,我们必须对&#34;绑定&#34;直到运行时。 &#34;也许shapeHelper将证明自己有一个非常幸运的&#39;实际上找到要调用的方法CustomEditorGet的类型?&#34;所以你在运行时得到了异常。

答案 1 :(得分:0)

在我看来,就像滥用部分类一样,正确的构造是一种抽象方法。干得多。