logo SERENITY
Game Systems Foundation
Search Results for

    Show / Hide Table of Contents

    Class ExtensionPointCatalog

    Reflection-based discovery of every Serenity extension point beyond the I{X}Service aggregates AggregateCatalog already covers: persistence stores, aggregate repositories, aggregate gateways, curated infrastructure factories, and the abstract PersistenceInstaller backend seam. The guarded assembly scan is shared with AggregateCatalog via Serenity.ServiceExtensionCreator.Editor.AggregateCatalog.SafeGetLoadedTypes. Every target type is resolved by simple-name string matching over the loaded-types scan rather than a compile-time reference (mirrors Serenity.ServiceExtensionCreator.Editor.AggregateCatalog.FindType(System.Collections.Generic.List{System.Type},System.String,System.Func{System.Type,System.Boolean})), so this editor assembly never needs an asmdef reference to Persistence, FilePersistence, Score, AudioPlayer, etc.

    Inheritance
    object
    ExtensionPointCatalog
    Inherited Members
    object.ToString()
    object.Equals(object)
    object.Equals(object, object)
    object.ReferenceEquals(object, object)
    object.GetHashCode()
    object.GetType()
    object.MemberwiseClone()
    Namespace: Serenity.ServiceExtensionCreator.Editor
    Assembly: Serenity.ServiceExtensionCreator.Editor.dll
    Syntax
    public static class ExtensionPointCatalog

    Methods

    Discover()

    Discovers every extendable extension point across every kind EXCEPT Class (see DiscoverUserClasses()). Cached for the lifetime of the current domain.

    Declaration
    public static IReadOnlyList<ExtensionPointDescriptor> Discover()
    Returns
    Type Description
    IReadOnlyList<ExtensionPointDescriptor>

    DiscoverNotSubclassableUserClasses()

    The public user classes that CANNOT be subclassed through this tool, each paired with its reason — sealed, abstract, or method-less (nothing to override AND nothing to virtualize, the POCO/DTO case; without this bucket such a class would silently match no tier at all, the exact dead-end the picker tiers exist to kill). Static classes and delegates, which are technically sealed/abstract too, are omitted: listing them as "sealed" would only confuse. Display-only entries, no descriptors: the wizard renders them as disabled rows with the reason. Same assembly filters as DiscoverUserClasses(); own lazy cache.

    Declaration
    public static IReadOnlyList<NotSubclassableUserClass> DiscoverNotSubclassableUserClasses()
    Returns
    Type Description
    IReadOnlyList<NotSubclassableUserClass>

    DiscoverUserClasses()

    Discovers every plain user class offered as an Class extension point: public, non-abstract, non-sealed, non-generic-definition classes with overridable public or protected members, from user assemblies only (Serenity/Unity/BCL/test assemblies are excluded — see Serenity.ServiceExtensionCreator.Editor.ExtensionPointCatalog.IsExcludedUserClassAssembly(System.Reflection.Assembly)). Deliberately its own lazy cache, NEVER folded into Discover(): this scan sweeps every user type in the project, and the main catalog must not pay for it unless the user actually searches for a class (the wizard only queries this when the search filter is non-empty).

    Declaration
    public static IReadOnlyList<ExtensionPointDescriptor> DiscoverUserClasses()
    Returns
    Type Description
    IReadOnlyList<ExtensionPointDescriptor>

    DiscoverVirtualizableUserClasses()

    Discovers every user class that is NOT subclassable yet but could become so: same filters as DiscoverUserClasses(), except it requires the class to FAIL the overridable-members check while still declaring at least one patchable public instance method (HasPatchableMethods(Type)). Each surfaces as a Class-kind descriptor flagged RequiresVirtualization — generation against it is always rejected; the wizard routes it to member-selection virtualization instead. Own lazy cache, never part of Discover(), only swept while the wizard search filter is active.

    Declaration
    public static IReadOnlyList<ExtensionPointDescriptor> DiscoverVirtualizableUserClasses()
    Returns
    Type Description
    IReadOnlyList<ExtensionPointDescriptor>

    Invalidate()

    Clears the cached catalog, forcing the next Discover() call to re-scan.

    Declaration
    public static void Invalidate()

    InvalidateNotSubclassableUserClasses()

    Clears the cached not-subclassable list, forcing the next DiscoverNotSubclassableUserClasses() call to re-scan.

    Declaration
    public static void InvalidateNotSubclassableUserClasses()

    InvalidateUserClasses()

    Clears the cached user-class catalog, forcing the next DiscoverUserClasses() call to re-scan.

    Declaration
    public static void InvalidateUserClasses()

    InvalidateVirtualizableUserClasses()

    Clears the cached virtualizable-user-class catalog, forcing the next DiscoverVirtualizableUserClasses() call to re-scan.

    Declaration
    public static void InvalidateVirtualizableUserClasses()
    In this article
    © 2026 Serenity. All Rights Reserved