Power up system with actions

Hello! I’m adding power-ups to my game and I’m building my own power-up system, but I’ll be doing it in observer pattern! This will include onCollected action, where the action is called when the player collects power-up,=, like this:

using UnityEngine;

public class PowerUp : MonoBehaviour, IItem
{
    public AudioClip itemSound;
    public static Action onCollected;

    public void Collect()
    {
        onCollected?.Invoke();
        gameObject.SetActive(false);
        AudioManager.instance.PlaySound(itemSound);
    }
}

And when the onCollected action is invoked, the Player script listens to it and tells itself to activate it’s power, like this:

public void OnEnable()
{
    PowerUp.onCollected += ActivateMyPower;
}

public void OnDisable()
{
    PowerUp.onCollected -= ActivateMyPower;
}
if (other.gameObject.CompareTag("Collectible"))
{
     other.GetComponent<IItem>().Collect();
}
private void ActivateMyPower()
{
     //Activate my power
}

My only problem with this is that, when I have to create a new power up, all I have to do this just literally cope the PowerUp script like this above and do the same thing, but rename it with different the power up name, and repeat…

I use actions because I want to reduce complexity, and since power-ups will just tell the player to activate/upgrade their power, without doing anything unique in the code itself.

I don’t want to redo these codes just for new power ups, that would be considered bad practice, and since actions are used, it makes it worse. If there is the only way to make this a lot easier, maybe better solution for this or an alternative?