2016-08-05 3 views
1
static class Extensions 
{ 
    public static string Primary<T>(this T obj) 
    { 
     Debug.Log(obj.ToString()); 
     return ""; 
    } 

    public static string List<T>(this List<T> obj) 
    { 
     Debug.Log(obj.ToString()); 
     return ""; 
    } 
} 

Verwenden Reflexion die beiden ErweiterungsmethodenWie verwende ich C# -Reflexion, um eine Erweiterungsmethode mit generischem List-Parameter aufzurufen?

//This works 
var pmi = typeof(Extensions).GetMethod("Primary"); 
var pgenerci = pmi.MakeGenericMethod(typeof(string)); 
pgenerci.Invoke(null, new object[] {"string" }); 

//This throw a "ArgumentException: failed to convert parameters" 
var mi = typeof(Extensions).GetMethod("List"); 
var stringGeneric = mi.MakeGenericMethod(typeof(List<string>)); 
stringGeneric.Invoke(null, new object[] {new List<string> { "list of string"}, }); 

Ich arbeite mit Unity3d, aufzurufen, um die .net Version 3.5

Antwort

1

Der Typ ist, den Sie MakeGenericMethod passieren müssen, ist string, nicht List<string>, weil der Parameter als T verwendet wird.

var mi = typeof(Extensions).GetMethod("List"); 
var stringGeneric = mi.MakeGenericMethod(typeof(string)); 
stringGeneric.Invoke(null, new object[] {new List<string> { "list of string"} }); 

Andernfalls Sie machen eine Methode, die eine Liste von Listen von Zeichenketten akzeptiert.

0

Da typeof (Liste < "T">) nicht den richtigen Typ zurückgegeben.

Sie sollten eine Erweiterungsmethode schreiben, um den Typ der generischen Liste zu erhalten.

oder Sie können Ihren Code wie diese

var listItem = new List<string> { "alex", "aa" }; 
var typeOfGeneric = listItem.GetType().GetGenericArguments().First<Type>(); 
var mi = typeof(Extensions).GetMethod("List"); 
var stringGeneric = mi.MakeGenericMethod(typeOfGeneric); 
stringGeneric.Invoke(null, new object[] { listItem }); 

ändern => funktioniert es

Verwandte Themen