反思:FindMembers 返回空

Reflection: FindMembers returning empty

我试图列出具有给定属性的所有成员,我已经实现了一个使用 FindMembers 的方法,但它总是 return 一个空集合。谁能告诉我我做错了什么?

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>();

它return是空的。

来自docsBindingFlags.Default:

Specifies that no binding flags are defined.

您需要准确地告诉 FindMembers 您想要什么,例如,如果您想要 public 静态成员或实例成员:

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()