1

私のコードは

    var memberList = from member in type.GetMembers(BindingFlags.Static | BindingFlags.Public)
        .Where(m => !(m.Name.Contains("get_") || m.Name.Contains("set_") ||
                    m.Name.Contains("add_") || m.Name.Contains("remove_")) )
        select member;

もっとエレガントな方法は?

UPD: イベント ハンドラーの add_/remove_ メンバーなし

4

1 に答える 1

5

定義されたアクセサーのクエリを作成し、それらを除外できます。

var propertyAccessors = type.GetProperties(BindingFlags.Static | BindingFlags.Public)
                            .SelectMany(p => p.GetAccessors())
                            .Cast<MemberInfo>();

var eventAccessors = type.GetEvents(BindingFlags.Static | BindingFlags.Public)
                         .SelectMany(e => new[] {
                             e.GetAddMethod(true),
                             e.GetRemoveMethod(true)
                         })
                         .Cast<MemberInfo>();

var accessors = propertyAccessors.Concat(eventAccessors);

var memberList = type.GetMembers(BindingFlags.Static | BindingFlags.Public)
                     .Except(accessors);

特別な名前を持たないメソッドだけを除外することで回避できる場合があります ( MethodBase.IsSpecialName.

var memberList = type.GetMembers(BindingFlags.Static | BindingFlags.Public)
                     .Where(m => {
                         var method = m as MethodBase;
                         return method == null || !method.IsSpecialName;
                     });
于 2013-05-02T18:18:46.867 に答える