How to switch gameobject component based on other component input?

Hello, Im trying to do component switching in editor mode. I have component with predifined list of behaviors. And I would like to have an option to select that behavior from the editor. So I prepared MonoBehavior classes which implements IMyBehaviorInterface with required methods. Then I would like to have SerializedField in main script that can select such behavior. Ive implemented that approach with help of

 enum MovementClasses { GravityMovement, NonGravity}

[SerializeField]
    MovementClasses movementClass;

void Awake()
{
    playerMovement = GetComponent<IPlayerMovement>();
}

private void OnValidate()
    {
        switch (movementClass)
        {
            case MovementClasses.GravityMovement:
                {
                    IPlayerMovement component;
                    if (TryGetComponent<IPlayerMovement>( out component))
                    {
                        var existingComponent = GetComponent(component.GetType());
                        UnityEditor.EditorApplication.delayCall += () =>
                        {
                            DestroyImmediate(existingComponent);
                        };
                    }
                    playerMovement = gameObject.AddComponent(typeof(GravityMovement)) as IPlayerMovement;
                    break;
                }
            case MovementClasses.NonGravity:
                {
                    IPlayerMovement component;
                    if (TryGetComponent<IPlayerMovement>(out component))
                    {
                        var existingComponent = GetComponent(component.GetType());
                        UnityEditor.EditorApplication.delayCall += () =>
                        {
                            DestroyImmediate(existingComponent);
                        };
                    }
                    playerMovement = gameObject.AddComponent(typeof(NonGravityMovement)) as IPlayerMovement;
                    break;
                }
        }
        

    }

But there is an issue , that when I start playmode , my component instance resets, and I dont have a reference in my playerMovement variable to use it. I assume that it is related to delayCall which invoked after entering playMode, but its the only way I found how to remove component from the inspector mode. Could you please suggest how can I fix it or maybe achive my goal another way in Unity. Thank you in advance.

Hi King_Artes, maybe you can try the following updated script?

using System;
using UnityEngine;

[ExecuteInEditMode]
public class Test : MonoBehaviour
{
    enum MovementClasses { GravityMovement, NonGravity }


    [SerializeField]
    private MovementClasses movementClass;

    public IPlayerMovement playerMovement { get; private set; }

    private bool isDirty;


    private void Awake()
    {
        playerMovement = GetComponent<IPlayerMovement>();
    }

    private void Update()
    {
        if (isDirty)
        {
            SwitchComponent();
            isDirty = false;
        }
    }

    private void OnValidate()
    {
        isDirty = true;
    }

    private void SwitchComponent()
    {
        Type targetComponentType = null;

        switch (movementClass)
        {
            case MovementClasses.GravityMovement:
                targetComponentType = typeof(GravityMovement);
                break;
            case MovementClasses.NonGravity:
                targetComponentType = typeof(NonGravityMovement);
                break;
        }

        if (targetComponentType == null)
        {
            return;
        }

        IPlayerMovement existingPlayerMovement;

        TryGetComponent<IPlayerMovement>(out existingPlayerMovement);

        if (existingPlayerMovement != null &&
            existingPlayerMovement.GetType() != targetComponentType)
        {
            var existingComponent = GetComponent(existingPlayerMovement.GetType());
            DestroyImmediate(existingComponent);

            existingPlayerMovement = null;
        }

        if (existingPlayerMovement == null)
        {
            playerMovement = gameObject.AddComponent(targetComponentType) as IPlayerMovement;
        }
    }
}