gpt4 book ai didi

c# - 在静态类上查找泛型方法

转载 作者:行者123 更新时间:2023-11-30 16:49:07 25 4
gpt4 key购买 nike

我有课

public static class MyClass
{

public static T MyMethod<T>(T item) where T : ISomeInterface<T>, new
{
return MyMethod(new[] { item}).First();
}

public static IEnumerable<T> MyMethod<T>(params T[] items) where T : ISomeInterface<T>, new
{
// for simplicity
return items.ToList();
}
}

和一堆更复杂的重载。现在我想扩展这个类(因为我想从 powershell 调用)

    public static IEnumerable MyMethod(string typeName, params object[] items)
{
var type = Type.GetType(typeName, true, true);
var paramTypes = new Type[] { type.MakeArrayType() };
var method = typeof(MyClass).GetMethod(
"MyMethod", BindingFlags.Public | BindingFlags.Static
| BindingFlags.IgnoreCase, null, paramTypes, null);
return method.Invoke(null, new object[] { items });
}

但是 method 总是空的。这是通过 GetMethod() 获取我的特定方法的正确方法。

最佳答案

我不认为你可以使用 GetMethod搜索通用方法(虽然我不确定)。但是,您可以使用 GetMethods获取所有方法,然后像这样过滤它们:

var method = typeof (MyClass)
.GetMethods(
BindingFlags.Public | BindingFlags.Static )
.Single(x => x.Name == "MyMethod"
&& x.IsGenericMethod
&& x.ReturnType == typeof(IEnumerable<>)
.MakeGenericType(x.GetGenericArguments()[0]));

请注意,最后一个条件是检查方法的返回类型是否为 IEnumerable<T>这样我们就不会得到返回 T 的方法相反。

请注意,您可以缓存 method变量作为静态变量,这样您就不必每次都搜索它。

请注意,返回的方法仍然是打开的(它仍然是 MyMethod<T> )。您仍然需要通过调用 MakeGenericMethod 创建一个封闭版本在这样的方法上:

var closed_method = method.MakeGenericMethod(type);

然后您可以像这样调用它:

return (IEnumerable)closed_method.Invoke(null, new object[] { items });

关于c# - 在静态类上查找泛型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37188604/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com