如何通过反射查找类中带特性的公共静态方法与内部公共枚举?
问题1:如何找到标记了特性的静态方法?
你当前的代码虽然指定了BindingFlags.Static,但FindMembers的使用可能存在隐性问题,推荐换用更直观的方式:直接通过GetMethods获取所有符合条件的方法,再过滤特性,避免MemberFilter带来的意外干扰:
// 获取当前类的所有公共实例+静态方法 var allMethods = types[index].GetMethods(BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance); // 筛选带有MyCustomAttr的方法 foreach (var method in allMethods) { if (method.GetCustomAttributes(typeof(MyCustomAttr), inherit: false).Any()) { // 处理找到的方法(包括静态方法Method2) } }
如果一定要保留FindMembers的写法,检查两个关键点:
- 给
BindingFlags加上BindingFlags.DeclaredOnly,确保只查找当前类定义的方法(避免父类方法干扰) - 将第四个过滤参数改为
null(如果你的WorkflowMethodFilter不需要用到过滤条件)
调整后的代码示例:
foreach (MemberInfo member in types[index].FindMembers(MemberTypes.Method, BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly, new MemberFilter(WorkflowMethodFilter), null))
问题2:如何查找类内部定义的带特性的枚举?
类内部的枚举属于嵌套类型,需要用GetNestedTypes方法获取,再判断类型是否为枚举且带有目标特性:
// 获取当前类的所有公共嵌套类型 var nestedTypes = types[index].GetNestedTypes(BindingFlags.Public); // 筛选带有MyCustomAttr的枚举 foreach (var nestedType in nestedTypes) { if (nestedType.IsEnum && nestedType.GetCustomAttributes(typeof(MyCustomAttr), inherit: false).Any()) { // nestedType就是你要找的MyEnum的Type对象 } }
如果需要查找非公共的嵌套枚举,把BindingFlags改为BindingFlags.Public | BindingFlags.NonPublic即可。
内容的提问来源于stack exchange,提问作者XBond
相关产品推荐
相关产品推荐

