Check all permutations of generic type parameters
If this is a comment theme throughout your code I would say to make an IArgument interface that would manage your object parameters. But if this is the only time you are dealing with these obj parameters, I would say pass the arguments of IsSatisfied in as generic objects and let IsSatisfied worry about ordering the arguments by type:

    void IsSatisfied(params object[] objects)
    { 
        // T1 obj1 = &lt;find T1 in objects&gt;;
        // T2 obj2 = &lt;find T2 in objects&gt;;
        // T3 obj3 = &lt;find T3 in objects&gt;;
        // continue with previous implementation of IsSatisfied
    }


You would need to deal with the case when more than one of the objs is the same type.

Overall I don't like how the Test() method smells. You're passing in obj1, obj2, obj3, and possibly even obj4, every time, but you may only use obj2. What are obj1 and obj3 in this case?