无法在 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; }
........................................
我正在尝试创建一个图形扩展来修改其中一个移动扫描屏幕的行为,我在 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; }
........................................