C# reflection loop through methods and give unique names only (ignoring overloaded)
我正在使用下面的方法循环访问类中的所有静态方法,但有许多重载方法。我只需要唯一的名称,例如,如果有3个名为"run()"的重载方法,那么我只希望在查询中返回1而不是3。现在我不在乎是否有重载方法。有没有一种方法可以在查询时而不是在查询后过滤这个?这个类有600多个静态方法(它是来自另一个库的DLL绑定),如果我可以限制前面的唯一名称,它将有助于加快加载速度。我基本上是取名字并用名字填充一个菜单。
methodinfo[]lemethods=typeof(mytype).getmethods(bindingFlags.public bindingFlags.static);
我不相信在GetMethods通话中有任何方法可以做到,但之后用Linq很容易做到:
1 2 3 4 5
| var methodNames = typeof(MyType ).GetMethods(BindingFlags .Public |
BindingFlags .Static)
.Select(x => x .Name)
.Distinct()
.OrderBy(x => x ); |
请注意,我已经把排序放在了最后,所以没有什么可排序的——而且因为我们只得到了名称,所以我们只是执行自然排序。
- 非常好,非常感谢。那么我怎样才能按名称属性排序呢?我需要更熟悉Linq。我知道SQL,只希望它和SQL完全一样:)
- @用户441521:比SQL好:)我会编辑以进行更改…
- 所以我稍微修改了一下,让返回的是MethodInfo,而不仅仅是名称,但是当我试图用foreach循环它时,我得到了一个错误,它说"至少有一个对象必须实现IComparable"。如何修改它,使它返回一个MethodInfo列表而不是字符串?
- @用户441521:在这一点上,获得不同的元素变得有点痛苦。如果你喜欢的话,可以使用distingby和morelinq-morelinq.googlecode.com,并使用.DistinctBy(x => x.Name)。
- 我试试看。如果我只想在不使用distinct的情况下测试语法,我尝试以下方法,它给出了"必须实现IComparable"错误:var methodnames=typeof(leadwerksengine.le).getmethods(bindingFlags.public bindingFlags.static).select(x=>x).orderby(x=>x);foreach(methodname中的methodinfo mi){
- @用户441521:如果没有distinct,可以去掉Select,但是需要把OrderBy改成OrderBy(x => x.Name)。但值得正确地学习Linq,而不仅仅是通过复制示例。这是一项非常强大的技术。
- 谢谢你的帮助!是的,我必须读更多关于linq的内容,因为语法让我困惑。这一切都奏效了,让我达到了我所需要的,所以再次感谢。