首页 > 解决方案 > 反射: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>();

它返回空。

标签: c#reflectiontypesattributesmemberinfo

解决方案


文档中,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

推荐阅读