9

给定一些这样的类:

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();

我回来了:

  • 我的方法一
  • 我的虚拟方法一
  • 我的主类方法
  • 字符串
  • 等于
  • 获取哈希码
  • 获取类型

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

  • 字符串
  • 等于
  • 获取哈希码
  • 获取类型

编辑

到目前为止,这个黑客正在工作,但想知道是否有更清洁的方法:

        var exceptonList = new[] { "ToString", "Equals", "GetHashCode", "GetType" };
        var methods = myInstanceOfMyType.GetType().GetMethods()
            .Select(x => x.Name)
            .Except(exceptonList);
4

4 回答 4

12

如果你使用

var myMethods = new MyMainClass().GetType().GetMethods()
    .Where(m => m.DeclaringType != typeof(object));

您将丢弃那些底部的四种方法,除非它们在您的层次结构中的某个地方被覆盖。

(我自己也想要这种行为,但如果你想让这四个排除任何东西,那么 Cuong 的回答会这样做。)

于 2012-09-18T10:56:22.897 回答
10

你也可以做到这一点:

var methods = typeof(MyMainClass)
                    .GetMethods()
                    .Where(m => !typeof(object)
                                     .GetMethods()
                                     .Select(me => me.Name)
                                     .Contains(m.Name));
于 2012-09-18T10:56:27.827 回答
5

尝试这个。

GetMethods().Where((mi)=> mi.DeclaringType != typeof(object));

使用一点 LINQ,您可以消除object类中声明的所有方法。

于 2012-09-18T10:49:48.050 回答
-2

我们也可以明确排除它们:

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));
        }

这种方法不怕覆盖这些方法

于 2018-06-08T13:19:48.707 回答