反思: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是空的。
来自docs、BindingFlags.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()
我试图列出具有给定属性的所有成员,我已经实现了一个使用 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是空的。
来自docs、BindingFlags.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()