【问题标题】:Unable to use protected method override in Acumatica Graph Extension无法在 Acumatica Graph Extension 中使用受保护的方法覆盖
【发布时间】:2021-03-10 16:16:35
【问题描述】:

我正在尝试创建一个图形扩展来修改其中一个移动扫描屏幕的行为,并且我在 2020 R1 的开发人员发行说明中发现能够使用 [PXProtectedAccess] 属性来利用图形的受保护成员来自扩展,即使它不直接继承自它。

但是,为了利用它,Graph Extension 类需要是抽象的,而当我这样做时,Acumatica 似乎不再识别它。我确定我在这里遗漏了一个关键部分,但我无法根据文档弄清楚它是什么。编辑:我错过了类本身的[PXProtectedAccess] 属性。

现在,当我尝试实际调用抽象方法时,我看到了其他东西。当我尝试调用这些受保护成员中的任何一个时,它会抛出 Unable to cast object of type 'Wrapper.PX.Objects.IN.Cst_INScanIssueHost' to type 'INScanIssueHostDynamicInterface'.。我不确定INScanIssueHostDynamicInterface 指的是什么或如何解决这里的类型冲突。

这是我正在使用的代码的摘录:

    [PXProtectedAccess]
    public abstract class INScanIssue_Extension : PXGraphExtension<INScanIssue, INScanIssueHost>
    {
        [PXProtectedAccess]
        protected abstract void ReportError(string errorMsg, params object[] args);

        public delegate void ProcessConfirmDelegate();
        [PXOverride]
        public virtual void ProcessConfirm(ProcessConfirmDelegate baseMethod)
        {
            ReportError("TEST");
        }
    }

【问题讨论】:

    标签: acumatica


    【解决方案1】:

    我认为你走在正确的道路上。您的 graphExtension 应该是抽象的。另请注意,在您的扩展上您通过指定属性的参数来使用图形扩展的受保护成员,如下所示:

    public class MyGraph : PXGraph<MyGraph>
    {
       protected void Bar() { }
    }
    
    public class MyExt : PXGraphExtension<MyGraph>
    {
       protected void Foo() { }
    }
    
    [PXProtectedAccess]
    public abstract class MySecondLevelExt : PXGraphExtension<MyExt, MyGraph>
    { 
        [PXProtectedAccess]
        protected abstract void Bar();
    
        [PXProtectedAccess(typeof(MyExt))]
        protected abstract void Foo();
     }
    

    因此,在您的情况下,我认为您可以尝试将该参数添加到那些来自 INScanIssue(或在那里被覆盖)的成员的 ProctectedAccess 属性中:

    namespace PX.Objects.IN
    {
       [PXProtectedAccess]
       public abstract class INScanIssue_Extension : PXGraphExtension<INScanIssue, 
           INScanIssueHost>
    {
        public static bool IsActive()
        {
            return true;
        }
    
        # region Protected Access
    
        *[PXProtectedAccess(typeof(INScanIssue))]*
        protected abstract void ClearHeaderInfo(bool redirect = false);
    
        [PXProtectedAccess]
        protected abstract void SetScanState(string state, string message = null, params object[] args);
    
        [PXProtectedAccess(typeof(INScanIssue))] 
        protected abstract bool PromptLocationForEveryLine { get; }
    ........................................
    

    【讨论】:

      【解决方案2】:

      仅使用抽象扩展来访问受保护的成员,然后添加第二级扩展,从您的第一级扩展调用公开的成员。而且我认为您不需要在扩展上应用该属性。

      public abstract class INScanIssueProtectedAccessExt : PXGraphExtension<INScanIssue, INScanIssueHost>
      {
          [PXProtectedAccess]
          public abstract void ReportError(string errorMsg, params object[] args);
      }
      
      public class INScanIssue_Extension : PXGraphExtension<INScanIssueProtectedAccessExt, INScanIssue, INScanIssueHost>
      {      
          public delegate void ProcessConfirmDelegate();
          [PXOverride]
          public virtual void ProcessConfirm(ProcessConfirmDelegate baseMethod)
          {
              this.Base2.ReportError("TEST");
          }
      }
      

      【讨论】:

      • 我想到了这一点,但问题是我需要实现抽象成员,而不是让 Acumatica 框架生成将其连接回图形的原始受保护成员的实现。另外,我确实需要将受保护的属性放在扩展上,因为没有它,整个事情都会被忽略。
      • 抱歉,我误读了您的代码。它不需要实现抽象成员,但是当我尝试将其分离到另一个扩展中时,它在尝试调用抽象成员时仍然存在相同的转换错误。
      猜你喜欢
      • 2018-10-02
      • 2013-07-01
      • 1970-01-01
      • 2011-08-04
      • 2015-10-01
      • 2022-07-08
      • 1970-01-01
      • 2012-01-31
      • 2012-01-26
      相关资源
      最近更新 更多