如何使用C#反射来调用具有泛型List参数的扩展方法

本文关键字:List 泛型 参数 方法 扩展 何使用 反射 调用 | 更新日期: 2023-09-27 18:01:00

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

如何使用C#反射来调用具有泛型List参数的扩展方法

需要传递给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"} });

否则,您将生成一个接受字符串列表的方法。

因为typeof(List<"T">(没有返回正确的类型。

您应该编写一个扩展方法来获取泛型列表的类型。

或者你可以像这个一样修改你的代码

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

=>它在上工作