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

无法在Acumatica图形扩展中使用受保护的方法重写,acumatica,Acumatica,我正试图创建一个图形扩展来修改其中一个移动扫描屏幕的行为,我在2020 R1的开发者发行说明中发现,可以使用[PXProtectedAccess]属性利用扩展中的图形受保护成员,即使它不直接从扩展继承 然而,为了利用这一点,图形扩展类需要是抽象的,并且Acumatica在我这样做时似乎不再识别它。我确信我在这里遗漏了一个关键部分,但我无法根据文档找出它是什么。编辑:我缺少类本身的[PXProtectedAccess]属性 现在,当我尝试实际调用抽象方法时,我看到了一些其他东西。当我试图调用这些受

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

然而,为了利用这一点,图形扩展类需要是抽象的,并且Acumatica在我这样做时似乎不再识别它。我确信我在这里遗漏了一个关键部分,但我无法根据文档找出它是什么。编辑:我缺少类本身的
[PXProtectedAccess]
属性

现在,当我尝试实际调用抽象方法时,我看到了一些其他东西。当我试图调用这些受保护的成员中的任何一个时,它抛出
无法将'Wrapper.PX.Objects.IN.Cst_inscanisHost'类型的对象强制转换为'inscanisHostDynamicInterface'。
。我不确定CanisUserDynamicInterface中的
指的是什么,也不确定如何解决此处的类型冲突

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

    [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");
        }
    }
[PXProtectedAccess]
公共抽象类INScanIssue_扩展:pxGrapherExtension
{
[PXProtectedAccess]
受保护的抽象void ReportError(字符串errorMsg,参数对象[]args);
公共委托无效ProcessConfirmDelegate();
[PXOverride]
公共虚拟无效ProcessConfirm(ProcessConfirmDelegate baseMethod)
{
报告错误(“测试”);
}
}

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

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");
    }
}
公共抽象类inscanisuprotectedaccesstext:PXGraphExtension
{
[PXProtectedAccess]
public abstract void ReportError(字符串errorMsg,参数object[]args);
}
公共类INScanIssue_扩展:pxGrapherExtension
{      
公共委托无效ProcessConfirmDelegate();
[PXOverride]
公共虚拟无效ProcessConfirm(ProcessConfirmDelegate baseMethod)
{
本条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");
    }
}
公共抽象类inscanisuprotectedaccesstext:PXGraphExtension
{
[PXProtectedAccess]
public abstract void ReportError(字符串errorMsg,参数object[]args);
}
公共类INScanIssue_扩展:pxGrapherExtension
{      
公共委托无效ProcessConfirmDelegate();
[PXOverride]
公共虚拟无效ProcessConfirm(ProcessConfirmDelegate baseMethod)
{
本条2.报告错误(“测试”);
}
}

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

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();
 }
公共类MyGraph:PXGraph
{
受保护的空栏(){}
}
公共类MyExt:pXgrapherExtension
{
受保护的void Foo(){}
}
[PXProtectedAccess]
公共抽象类MySecondLevelExt:PXGraphExtension
{ 
[PXProtectedAccess]
受保护的抽象空条();
[PXProtectedAccess(typeof(MyExt))]
受保护的抽象void Foo();
}
因此,在您的情况下,我认为您可以尝试将该参数添加到来自INScanIssue(或在此处重写)的成员的proctedAccess属性中:

名称空间PX.Objects.IN
{
[PXProtectedAccess]
公共抽象类INScanIssue_扩展:pxGrapherExtension
{
公共静态bool IsActive()
{
返回true;
}
#区域保护访问
*[PXProtectedAccess(类型(INScanIssue))]*
受保护的抽象无效ClearHeaderInfo(bool redirect=false);
[PXProtectedAccess]
受保护的抽象void SetScanState(字符串状态,字符串消息=null,参数对象[]args);
[PXProtectedAccess(类型(INScanIssue))]
受保护的抽象布尔PrompLocationForeveryline{get;}
........................................

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

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();
 }
公共类MyGraph:PXGraph
{
受保护的空栏(){}
}
公共类MyExt:pXgrapherExtension
{
受保护的void Foo(){}
}
[PXProtectedAccess]
公共抽象类MySecondLevelExt:PXGraphExtension
{ 
[PXProtectedAccess]
受保护的抽象空条();
[PXProtectedAccess(typeof(MyExt))]
受保护的抽象void Foo();
}
因此,在您的情况下,我认为您可以尝试将该参数添加到来自INScanIssue(或在此处重写)的成员的proctedAccess属性中:

名称空间PX.Objects.IN
{
[PXProtectedAccess]
公共抽象类INScanIssue_扩展:pxGrapherExtension
{
公共静态bool IsActive()
{
返回true;
}
#区域保护访问
*[PXProtectedAccess(类型(INScanIssue))]*
受保护的抽象无效ClearHeaderInfo(bool redirect=false);
[PXProtectedAccess]
受保护的抽象void SetScanState(字符串状态,字符串消息=null,参数对象[]args);
[PXProtectedAccess(类型(INScanIssue))]
受保护的抽象布尔PrompLocationForeveryline{get;}
........................................

我想到了这一点,但问题是我需要实现抽象成员,而不是让Acumatica框架生成将其连接回原始pro的实现