Tutorials on Trigger Systems?

I’m trying to implement a trigger system: A trigger registers to an event (easy enough) and when the event is fired, the listening triggers sets a set of condition before executing a set of actions.
The problem I’m having so far is making a simple, re-useable, and generic trigger.
I’m making the trigger also attacheable to an object. The condition should and actions should therefore be able take information from the event and the object it is attached to evaluate the condition and run the actions.

This is kinda what I’m looking to do (yes, free-handed + it’s full of mistakes I know but it’s just for illustrative purposes):

public class AbilityUsedEvent :Event{
    public string AbilityUsed;
   public GameObject User;
}

class Program
{
    static void Main()
    {
        Func<Event, int, bool> condition = delegate(Event e, int i)
        {
            return e.AbilityUsed == "Fireball";
        };
        Action<String, GameObject> action = delegate(string s, GameObject y)
        {
            Debug.Log(s + y.Name);
        };
        Func<Event, string> retrieval = delegate(Event e) // this will be used to pass arguments to condition / action ?
        {
            return e.AbilityUsed;
        };
var trigger = new Trigger(condition, retrieval, action); // doesn't work, type needs to be specified
//subscribe trigger to event

/* too long code  var t = new Trigger< Func<Event, int, bool>,Func<Event, string>, Action<String, int> >(condition, retrieval, new Action<String, int>[] {act}); */ // works but too long
    }
}

//how to do the stuff below...
public class Trigger<P, E, A>{

    public P p;
    public E e;
    public A[] a;

    public Trigger(P p, E e, A[] a){}

    public void Run<X>(X x){
       p(//parameters)
    }

}