Por lo tanto, estoy seguro de que esto ya se ha respondido en algún lugar, pero no lo pude encontrar en ningún lado. Esperando que algunos géneros genéricos puedan ayudar.Método genérico con acción <T> parámetro
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
}
- Tipo de argumento 'orangután' no no es asignable a parámetro de tipo 'T' tipo
- Argumento 'IAnimal' es asignable a parámetro de tipo 'T'
Editar: Based en Yuriy y otras sugerencias, podría hacer algo de fundición como:
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);
}
Lo que quería hacer era llamar al método ValidateUsing así:
ValidateUsing(Foo);
Por desgracia, si foo es el siguiente:
private void Foo(Orangutan obj)
{
//Do something
}
tengo que especificar explícitamente el tipo cuando llamo ValidateUsing
ValidateUsing<Orangutan>(Foo);
Gracias bdukes, acabo de utilizar el orangután como ejemplo. Probablemente uno malo. Quiero poder invocar la acción con cualquier IAnimal. En el código "real", el IAnimal se almacena como un campo privado en la clase. Entonces, realmente no estoy instanciando nada. –