You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过反射查找类中带特性的公共静态方法与内部公共枚举?

问题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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 03:26:13