Отражение: FindMembers возвращается пустым - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь составить список всех членов с данным атрибутом, я реализовал метод, который использует 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 ]

0 голосов
/ 14 февраля 2019

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

var members = type.GetMembers().Where(x => Attribute.IsDefined(x, typeof(TestAttribute))).ToList()
0 голосов
/ 14 февраля 2019

Из документов , 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...