Generische Methode mit dem Parameter Action <T>

Ich bin mir sicher, dass dies irgendwo zuvor beantwortet wurde, aber ich konnte es nirgendwo finden. Ich hoffe, dass ein Guru von Generika helfen kann.

public interface IAnimal{}
public class Orangutan:IAnimal{}

public void ValidateUsing<T>(Action<T> action) where T : IAnimal
{
    Orangutan orangutan = new Orangutan();
    action(orangutan);  //Compile error 1

    //This doesn't work either:
    IAnimal animal = new Orangutan();
    action(animal);  //Compile error 2
}
Argumenttyp 'Orang-Utan' kann nicht dem Parametertyp 'T' zugeordnet werdenArgumenttyp 'IAnimal' kann nicht dem Parametertyp 'T' zugewiesen werden

Bearbeiten: Basierend auf Yuriy und anderen VorschlägenIch könnte ein Casting machen wie:

public void ValidateUsing<T>(Action<T> action) where T : IAnimal
{
    Orangutan orangutan = new Orangutan();
    action((T)(IAnimal)orangutan);

    //This doesn't work either:
    IAnimal animal = new Orangutan();
    action((T)animal);
}

Ich wollte die ValidateUsing-Methode folgendermaßen aufrufen:

ValidateUsing(Foo);  

Wenn foo leider so aussieht:

private void Foo(Orangutan obj)
{
    //Do something
}

Ich muss den Typ explizit angeben, wenn ich ValidateUsing aufrufe

ValidateUsing<Orangutan>(Foo);

Antworten auf die Frage(5)

Ihre Antwort auf die Frage