2012-05-03 12 views
6

Ho questo metodo:Come si chiama un metodo generico se si conosce solo il parametro type in fase di esecuzione?

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

quindi voglio chiamare questo SomeMethod che va bene se conosco il tipo:

SomeMethod<Class1>(); 

Ma se ho solo Class1 in fase di esecuzione Sono in grado di chiamalo?

Quindi, come chiamare SomeMethod con tipo T sconosciuto? Ho ottenuto il tipo usando la riflessione.

Ho il tipo di tipo ma SomeMethod<Type | GetType()> non funziona.

Aggiornamento 7. Maggio:

Ecco un codice di esempio di ciò che voglio ottenere:

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 }; 
     } 
    } 
} 

Questa è una demo preso fuori di un contesto più grande.

+3

SLaks ha risposto alla tua domanda. Sto solo notando che hai abusato della parola "anonymous" qui, il che significa qualcosa di diverso. Nel tuo caso, T è generico. – SimpleVar

+0

Questa è la tua chiamata API o qualche API di terze parti? Se è tuo, allora considera di cambiarlo, perché i generici non risolvono il problema ma lo creano in questo caso. – empi

+1

possibile duplicato di [Chiamare un metodo generico con un argomento di tipo noto solo al momento dell'esecuzione] (http://stackoverflow.com/questions/325156/calling-generic-method-with-a-type-argument-known-only-at -execution-time) – user7116

risposta

8

è necessario chiamare utilizzando la riflessione:

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

Non si tratta di chiamare un metodo sconosciuto ma è il parametro che non conosco fino al runtime. Per esempio. se è Class1 o Class2, ecc. – bluee

+0

SLaks e sixlettervariables mi hanno indirizzato nella giusta direzione. Grazie ragazzi! – bluee

2

Si può fare uso di dynamic parola chiave in C# 4. Si richiede .NET 4.0 o superiore, nonché .:

SomeMethod((dynamic)obj); 

Il runtime deduce l'argomento del tipo effettivo e effettua la chiamata. Fallisce se obj è nullo poiché non sono rimaste informazioni sul tipo. null in C# non ha tipo.

Problemi correlati