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

私は戻ってきます:

  • MyMethodOne
  • MyVirtualMethodOne
  • MyMainClassMethod
  • ToString
  • 等しい
  • GetHashCode
  • GetType

最後の4つのメソッドが返されるのを回避するにはどうすればよいですか?myMethods

  • ToString
  • 等しい
  • GetHashCode
  • GetType

編集

これまでのところ、このハックは機能していますが、よりクリーンな方法があるかどうか疑問に思っていました。

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

階層のどこかでオーバーライドされていない限り、これらの下位4つのメソッドは破棄されます。

(私はこの振る舞いを自分で望んでいますが、これらの4つを除外したい場合は 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 に答える