1

我试图列出具有给定属性的所有成员,我实现了一个使用 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>();

它返回空。

4

2 回答 2

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
于 2019-02-14T11:56:49.910 回答
1

您也可以使用GetMembers()方法,然后过滤您的结果:

var members = type.GetMembers().Where(x => Attribute.IsDefined(x, typeof(TestAttribute))).ToList()
于 2019-02-14T12:04:38.743 回答