无法在 Acumatica 图形扩展中使用受保护的方法覆盖

Unable to use protected method override in Acumatica Graph Extension

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

但是,为了利用它,图形扩展 class 需要是抽象的,而当我这样做时,Acumatica 似乎不再识别它。我确定我在这里遗漏了一个关键部分,但我无法根据文档弄清楚它是什么。编辑:我缺少 class 本身的 [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");
        }
    }

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

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");
    }
}

我认为你走在正确的道路上。您的 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; }
........................................