1

我们开发了一个 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 的部分类并不能解决它。

有什么想法吗?

4

2 回答 2

1

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

看起来您遇到了部分方法和dynamic参数的“糟糕”鸡尾酒。

对于partial void没有“部分”partial class提供实现的方法,该partial void方法在编译时被视为“不存在”,并且实际上并未在 IL 中实现。

CustomEditorGet(part, shapeHelper, ref result);在第二个参数是编译时类型表达式的调用中dynamic,我们“绑定”到一个不存在的方法。通常,当不dynamic涉及时,整个调用/调用在编译时被“删除”。但是因为这是一个dynamic表达式,我们必须将“绑定”推迟到运行时。“也许shapeHelper会证明有一种非常'幸运'的类型,它实际上找到了一种方法CustomEditorGet来调用?” 所以你在运行时得到了异常。

于 2014-08-20T23:25:15.740 回答
0

在我看来,就像对部分类的滥用,其中正确的构造是抽象方法。更干燥。

于 2014-08-21T11:38:14.063 回答