acumaticaacuminator

How do I correct PX1011 warning from Acuminator? (it suggests sealing class, but that causes errors in error list)


I needed to add a new field to SOOrder and update attributes of another field. Both classes inherit PXCacheExtension, and both give a PX1011 warning that Because multiple levels of inheritance are not supported for PXCacheExtension, the derived type can be marked as sealed. I had extended it originally from within Acumatica 2018R1 but have moved the code from within the customization project into my Visual Studio Extension Library.

I started with:

public class SOOrderExt : PXCacheExtension<PX.Objects.SO.SOOrder>

If I change the declaration of the class to be:

public sealed class SOOrderExt : PXCacheExtension<PX.Objects.SO.SOOrder>

I get CS0549 SOOrderExt.UsrMyField is a new virtual member in a sealed class 'SOOrderExt'.

Thinking that maybe I missed something and don't need to declare my virtual int?, I commented out:

public virtual int? UsrMyField { get; set; }

and got CS1061 'SOOrderExt' does not contain a definitionfor 'UsrMyField' and no accessible extension method 'UsrMyField; accepting a first argument of type 'SOOrderExt' could be found.

Is the original PX1011 warning something I should ignore, or is there something special needed to follow the guidance to make it sealed or to know that sealing the class is not appropriate?

In short, how do I make these Acuminator warnings go away without simply suppressing and still define my fields?

I'm on 2018R2 Build 18.212.0033 with Visual Studio 2019 Community Edition and Acuminator 1.6.1.


Solution

  • You need to declare the property but the virtual keyword doesn't seem necessary. Otherwise the warning is an oversight if sealed = no virtual and no virtual = no custom fields.

    Without virtual keyword this cache extension seems to be working fine:

    public sealed class SOLineExt : PXCacheExtension<PX.Objects.SO.SOLine>
    {
        #region UsrField
        [PXDBString(12)]
        [PXUIField(DisplayName="Field")]
    
        // Ommit declaring the type as virtual
        public /*virtual*/ string UsrField { get; set; }
        public abstract class usrField : PX.Data.BQL.BqlString.Field<usrField> { }
        #endregion
    }