¿Cómo llama a un método genérico si solo conoce el parámetro de tipo en tiempo de ejecución?
Frecuentes
Visto 5,765 veces
8
Tengo este método:
public List<T> SomeMethod<T>( params ) where T : new()
Así que quiero llamar a esto SomeMethod
lo cual está bien si conozco el tipo:
SomeMethod<Class1>();
pero si solo tengo Class1
en tiempo de ejecución no puedo llamarlo?
Entonces como llamar SomeMethod
con tipo T desconocido? Obtuve Type usando la reflexión.
Tengo el Tipo de tipo pero SomeMethod<Type | GetType()>
no funciona.
Actualización 7. Mayo:
Aquí hay un código de muestra de lo que quiero lograr:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace ConsoleApplication63
{
public class DummyClass
{
}
public class Class1
{
public string Name;
}
class AssemblyTypesReflection
{
static void Main(string[] args)
{
object obj = new Class1() { Name = "John" } ;
Assembly assembly = Assembly.GetExecutingAssembly();
var AsmClass1 = (from i in assembly.GetTypes() where i.Name == "Class1" select i).FirstOrDefault();
var list = SomeMethod<AsmClass1>((AsmClass1)obj); //Here it fails
}
static List<T> SomeMethod<T>(T obj) where T : new()
{
return new List<T> { obj };
}
}
}
Esta es una demostración sacada de un contexto más amplio.
2 Respuestas
8
Necesitas llamarlo usando la reflexión:
var method = typeof(SomeClass).GetMethod("SomeMethod");
method.MakeGenericMethod(someType).Invoke(...);
contestado el 03 de mayo de 12 a las 15:05
4
Puedes hacer uso de dynamic
palabra clave en C# 4. También necesita .NET 4.0 o superior.:
SomeMethod((dynamic)obj);
El tiempo de ejecución infiere el argumento de tipo real y realiza la llamada. falla si obj
es nulo ya que entonces no queda información de tipo. null en C# no tiene tipo.
Respondido el 18 de enero de 14 a las 07:01
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas c# generics reflection or haz tu propia pregunta.
SLaks respondió bien a tu pregunta. Solo te estoy notando que usaste mal la palabra
anonymous
aquí, lo que significa algo diferente. En su caso, T es genérico. - SimpleVar¿Es esta su llamada API o alguna API de terceros? Si es suyo, considere cambiarlo, porque los genéricos no resuelven el problema, sino que lo crean en este caso. - empi
posible duplicado de Llamar a un método genérico con un argumento de tipo conocido solo en el momento de la ejecución - user7116
La idea es: quiero llamar a SomeMethod y, por lo general, lo llamaría SomeMethod. (); pero solo sé como una cadena que la clase que quiero usar es "Clase1" o alguna otra clase. - bluee