[英]Don't return ToString, Equals, GetHashCode, GetType with Type.GetMethods()
給定一些這樣的類:
public class MyBaseClass()
{
public void MyMethodOne()
{
}
public virtual void MyVirtualMethodOne()
{
}
}
public class MyMainClass : MyBaseClass()
{
public void MyMainClassMethod()
{
}
public override void MyVirtualMethodOne()
{
}
}
如果我運行以下命令:
var myMethods= new MyMainClass().GetType().GetMethods();
我回來了:
如何避免myMethods
中返回最后4個方法
編輯
到目前為止,此黑客正在運行,但想知道是否有更干凈的方法:
var exceptonList = new[] { "ToString", "Equals", "GetHashCode", "GetType" };
var methods = myInstanceOfMyType.GetType().GetMethods()
.Select(x => x.Name)
.Except(exceptonList);
如果您使用
var myMethods = new MyMainClass().GetType().GetMethods()
.Where(m => m.DeclaringType != typeof(object));
除非在繼承關系中的某個位置上覆蓋了這四種方法,否則您將丟棄這四種方法。
(我想這個問題我自己,但如果你想這四個排除一切 ,那么的Cuong的回答會做到這一點。)
您也可以做到這一點:
var methods = typeof(MyMainClass)
.GetMethods()
.Where(m => !typeof(object)
.GetMethods()
.Select(me => me.Name)
.Contains(m.Name));
嘗試這個。
GetMethods().Where((mi)=> mi.DeclaringType != typeof(object));
只需一點LINQ,您就可以消除object
類中聲明的所有方法。
我們還可以明確地排除它們:
public static IEnumerable<MethodInfo> GetMethodsWithoutStandard(this Type t)
{
var std = new List<string>() { nameof(ToString),
nameof(Equals),
nameof(GetHashCode),
nameof(GetType)};
return t.GetMethods().Where(x => !std.Contains(x.Name));
}
這種方法不怕覆蓋這些方法
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.