2012-05-03 14 views
6

tengo este método:¿Cómo llamas a un método genérico si solo conoces el parámetro de tipo en tiempo de ejecución?

public List<T> SomeMethod<T>(params) where T : new() 

por lo que quiero llamar a este SomeMethod lo cual está bien si conozco el tipo:

SomeMethod<Class1>(); 

Pero si sólo tengo Class1 en tiempo de ejecución Soy incapaz de ¿llámalo?

Entonces, ¿cómo llamar al SomeMethod con un tipo desconocido de T? Obtuve Type usando reflection.

Tengo el tipo de tipo pero SomeMethod<Type | GetType()> no funciona.

actualización 7. mayo:

Aquí es un código de ejemplo 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 sacado de un contexto más grande.

+3

SLaks ha respondido bien a su pregunta. Solo te estoy diciendo que usaste mal la palabra "anónimo" aquí, lo que significa algo diferente. En tu caso, T es genérico. – SimpleVar

+0

¿Es esta su API o alguna API de terceros? Si es tuyo, considera cambiarlo, porque los genéricos no resuelven el problema, sino que lo crean en este caso. – empi

+1

posible duplicado de [Llamando al método genérico con un argumento de tipo conocido solo en tiempo de ejecución] (http://stackoverflow.com/questions/325156/calling-generic-method-with-a-type-argument-known-only-at -execution-time) – user7116

Respuesta

8

es necesario llamar usando la reflexión:

var method = typeof(SomeClass).GetMethod("SomeMethod"); 
method.MakeGenericMethod(someType).Invoke(...); 
+0

No se trata de llamar a un método desconocido, pero es el parámetro que desconozco hasta el tiempo de ejecución. P.ej. si es Class1 o Class2, etc. – bluee

+0

Los SLaks y sixlettervariables me llevaron en la dirección correcta. ¡Gracias chicos! – bluee

2

Puede hacer uso de dynamic palabra clave en C# 4. Usted requiere .NET 4.0 o superior, así .:

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 no hay información de tipo restante. null en C# no tiene ningún tipo.

Cuestiones relacionadas