簡體   English   中英

不要使用Type.GetMethods()返回ToString,Equals,GetHashCode,GetType

[英]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();

我回來了:

  • 我的方法一
  • MyVirtualMethodOne
  • MyMainClassMethod
  • ToString
  • 等於
  • GetHashCode
  • 獲取類型

如何避免myMethods中返回最后4個方法

  • ToString
  • 等於
  • GetHashCode
  • 獲取類型

編輯

到目前為止,此黑客正在運行,但想知道是否有更干凈的方法:

        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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM