una - ¿Se pueden usar métodos genéricos en C#si el tipo es desconocido hasta el tiempo de ejecución?
metodo generico java (3)
La forma más sencilla de explicar lo que quiero decir es con un ejemplo de código. Esto no se compila, pero hay alguna manera de lograr este efecto:
foreach(Type someType in listOfTypes)
{
SomeMethod<someType>();
}
Sería realmente conveniente si eso funcionara, pero no funciona. ¿Hay otra manera de lograr lo mismo que arriba, y por qué C # no permite que eso sea una declaración legal?
Edición: Parece que la única forma de hacerlo es a través de la reflexión, que puede ser demasiado lenta para nuestras necesidades. ¿Alguna idea de por qué no hay una forma eficiente incorporada y si algo como esto está funcionando para C # 4.0?
¿Por qué C # no permite que eso sea una declaración legal?
Como otros han señalado, no puedes hacer esto. Por qué no? Bueno, considera tu ejemplo:
foreach(Type someType in listOfTypes)
{
SomeMethod<someType>();
}
Observe que cada tipo en la lista de tipos no puede conocerse hasta el tiempo de ejecución , mientras que el parámetro de tipo de SomeMethod
debe conocerse en el momento de la compilación . Es imposible que el compilador le diga a cuál SomeMethod<T>
resolver su invocación, por lo que esto es ilegal.
En C # 4, esto y muchas otras cosas similares serán posibles con la inclusión del DLR en el CLR. En particular, la invocación dinámica de métodos le permitirá invocar métodos que pueden no conocerse en el momento de la compilación.
La única manera de hacer esto hoy es a través de la reflexión. Consulte MethodInfo.MakeGenericMethod(Type[]) .
Puedes usar la reflexión. Suponiendo que el objeto actual contiene el método SomeMethod()
, el código para hacerlo se vería así:
GetType().GetMethod("SomeMethod").
MakeGenericMethod(new Type[] { someType }).Invoke(this, null);
Tenga en cuenta que si SomeMethod()
no es público, es posible que su código no se ejecute en entornos de menor confianza.