¿Cómo llama a un método genérico si solo conoce el parámetro de tipo en tiempo de ejecución?

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.

preguntado el 03 de mayo de 12 a las 15:05

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. -

¿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. -

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. -

2 Respuestas

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

No se trata de llamar a un método desconocido, sino que es el parámetro que no conozco hasta el tiempo de ejecución. P.ej. si es Class1 o Class2, etc.. - azul

SLaks y sixlettervariables me llevaron en la dirección correcta. ¡Gracias chicos! - azul

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 or haz tu propia pregunta.