Отражение: FindMembers возвращается пустым

Я пытаюсь перечислить всех членов с данным атрибутом, я реализовал метод, который использует FindMembers, но он всегда возвращает пустую коллекцию. Может кто-нибудь сказать мне, что я делаю не так?

public List<MemberInfo> GetMembers<TClass, TAttribute>()
{
    Type type = typeof(TClass);
    Type attributeType = typeof(TAttribute);
    List<MemberInfo> members = type.FindMembers(MemberTypes.All, BindingFlags.Default, Filter, null).ToList();
    return members;
}

public bool Filter(MemberInfo memberInfo, object filterCriteria)
{
    return memberInfo.IsDefined(typeof(TestAttribute));
}

[Test]
public string MethodName()
{
    return "test";
}

Когда это я называю так:

List<MemberInfo> members = GetMembers<TestClass, TestAttribute>();

Возвращается пустым.

2 ответа

Решение

Из документов, BindingFlags.Default:

Указывает, что флаги привязки не определены.

Вы должны сказать FindMembers именно то, что вы хотите, например, если вы хотите, чтобы открытые члены были статическими или членами экземпляра:

var flags = BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance;
List<MemberInfo> members = type.FindMembers(MemberTypes.All, flags, Filter, null).ToList();

Кроме того, вы можете добавить ограничение общего типа к вашему GetMember функция для ограничения типа атрибута:

public List<MemberInfo> GetMember<TClass, TAttribute>() 
    where TAttribute : Attribute

Вы также можете использовать GetMembers() метод, а затем отфильтровать ваш результат:

var members = type.GetMembers().Where(x => Attribute.IsDefined(x, typeof(TestAttribute))).ToList()
Другие вопросы по тегам