7

リフレクションを使用して、インターフェイスにメソッドのリストを表示したいと考えています。

public interface IRoadVehicle
{
  int WheelCount { get; }
  bool IsEmergency();
}

次のコードを使用します。

foreach (var m in typeof(IRoadVehicle).GetMethods())
{
  Console.WriteLine(m.Name);
}

ただし、インターフェイスにプロパティがある場合は、コンパイラによって生成されたプロパティ アクセサーも一覧表示されます。明示的に定義されたメソッドとプロパティ アクセサーを区別して後者を省略したいと思います。

//output:
//get_WheelCount
//IsEmergency

//desired output:
//IsEmergency

プロパティ関連のメソッドを除外するにはどうすればよいですか?

4

2 に答える 2

19

IsSpecialName次のプロパティを使用できます。

foreach (var m in typeof(IRoadVehicle).GetMethods().Where(x => !x.IsSpecialName))
{
    // ...
}

これにより、コンパイラによって何らかの形で特別に扱われる名前を持つすべてのメソッドが削除されます。ドキュメントはそれについてこれを言います:

SpecialName ビットは、一部のコンパイラ (プロパティ アクセサーや演算子のオーバーロード メソッドなど) によって特別な方法で処理されるメンバーにフラグを設定するために設定されます。

于 2012-08-31T13:53:13.370 に答える
9

どうですか:

var type = typeof(IRoadVehicle);

var accessors = type.GetProperties().SelectMany(property => property.GetAccessors());
var methods = type.GetMethods()
                  .Except(accessors);

ダニエル・ヒルガースの言及のように使用することもできますがIsSpecialName、これにより、オペレーター (インターフェースの問題ではない) やイベントアクセサーなどの他の「特別な」メソッドも除外されることに注意してください。本当にあなたが望むものに依存します。

于 2012-08-31T13:55:22.847 に答える