作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有课
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/
我是一名优秀的程序员,十分优秀!