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 "";
}
}
使用反射来调用两个扩展方法
//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"}, });
我正在使用Unity3d,因此.net版本为3.5
答案 0 :(得分:1)
您需要传递给MakeGenericMethod
的类型为string
,而不是List<string>
,因为该参数用作T
。
var mi = typeof(Extensions).GetMethod("List");
var stringGeneric = mi.MakeGenericMethod(typeof(string));
stringGeneric.Invoke(null, new object[] {new List<string> { "list of string"} });
否则,您正在创建一个接受字符串列表列表的方法。
答案 1 :(得分:0)
因为typeof(List&lt;&#34; T&#34;&gt;)没有返回正确的类型。
您应该编写一个扩展方法来获取通用列表的类型。
或者您可以像这样修改您的代码
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 });
=&GT;它的工作原理