¿Cómo puedo llamar al método genérico sin saber el tipo de objeto de instancia?

Con este código:

World w = new World();
var data = GetData<World>(w);

Si me da w con reflejo y este puede ser del tipo World, Ambient, Domention, etc.

¿Cómo puedo obtener GetData ?

Solo tengo el objeto de instancia:

var data = GetData<???>(w);

preguntado el 22 de mayo de 12 a las 11:05

2 Respuestas

var type = <The type where GetData method is defined>;

var genericType = typeof(w);

var methodInfo = type.GetMethod("GetData");

var genericMethodInfo = methodInfo.MakeGenericMethod(genericType);

//instance or null : if the class where GetData is defined is static, you can put null : else you need an instance of this class.
var data = genericMethodInfo.Invoke(<instance or null>, new[]{w});

contestado el 22 de mayo de 12 a las 12:05

No es necesario escribir la sección. C# decide implícitamente el tipo del parámetro en un método genérico si no se declara el tipo; solo ve con:

var data = GetData(w);

Aquí hay una muestra;

public interface IM
{

}

public class M : IM
{
}

public class N : IM
{

}

public class SomeGenericClass 
{
    public T GetData<T>(T instance) where T : IM
    {
        return instance;
    }
}

Y puedes llamarlo así;

IM a = new M();
SomeGenericClass s = new SomeGenericClass();
s.GetData(a);

contestado el 22 de mayo de 12 a las 12:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.