Damage System - How to reduce damage properly?

Well the whole subject is much more complex than the headline states so I’ll try to explain it as best as I can.

I have a Unit class, AttackMissile class and UnitManager class. Unit class call coroutine on AttackMissile class which moves the projectile toward target, when it reaches the target it should deal damage.

UnitManager class contains bunch of event that are embedded in methods to be called correspondingly to recreate some states that unit passes (Unit attacks / unit is attacked, unit deals damage / unit takes damage and etc) so I can attach different spells effect to this states. I’ll take Dota’s Axe for example and his passive, which triggers on UnitIsAttacked event. Let’s say that for my example I want a spell that reduces damage by some % when UnitTakesDamage. In TestSpellClass I’ll add a reference to which unit is monitored (Axe in our case) and i will subscribe the method that performs all about spell to the UnitTakesDamageEvent in UnitManager class by calling method UnitManager.Instance.UnitTakesDamageTrigger(some parameters…) which does following

public void UnitTakesDamageTrigger(some parameters...)
    if(UnitTakesDamageEvent != null)
        UnitTakesDamageEvent.Invoke(some parameters...)

And now comes the tricky part. If I want to deal damage in the end of coroutine that was called on the AttackMissile class, so my missile has reached target and now I need to deal damage, I call the method to invoke all effects that would affect the damage to be changed (in this case test ability), how can I do that? I can’t pass objects by reference to the events or either have events with return type, I get that. What if that same damage is affected by let’s say bonus 50 dmg, then % reduction of 15% and flat reduction of 15 dmg. That bring me to conclusion that i should have also damage handling class, DamageHandleClass where I would have some sort of array that hold all modifications of that damage, that performs those modification and them returns or deals that damage.

My question is am I thinking in right direction, and has anybody else stumbled upon same problem. I’m not asking for code solution just an idea which now I currently lack totally.

Thank you in advance.

So just as my original idea was, I have a list of objects that hold all the reductions and bonuses for damage and one method that calculates the damage. Same thing can be applied to let’s say attack speed, or some other stats (strength, agility, intelligence, armor whatever stats you have in your game)

Objects hold info about that damage I called the class BuffDamage (has: int id, float damageAmount, bool flat). Hope someone will find this usefull.