Отражение: 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()