如何从应用程序域中所有加载的程序集中获取所有静态类并使用反射调用静态方法

Posted

技术标签:

【中文标题】如何从应用程序域中所有加载的程序集中获取所有静态类并使用反射调用静态方法【英文标题】:How to get all the static classes from all the loaded assemblies in an app-domain and invoke a static method using reflection 【发布时间】:2015-02-12 11:20:52 【问题描述】:

我的要求如下,可以吗?如果是的话,有人可以指点我这方面的任何资源吗?

    从 应用领域 获取以单词“cache”结尾的静态类 从第 1 步检索到的程序集 从类中执行一个名为“invalidate”的静态方法 从第 2 步检索

【问题讨论】:

***.com/questions/2639418/… 您要解决什么问题?这对我来说听起来不正确。为什么不能直接在代码中调用这些方法。为什么需要反思?那是插件模型吗? 解决此类问题的更好方法通常是要求对象集中注册自己,或者(如果您必须有静态类)应用自定义属性并使用Attribute.GetCustomAttribute() 过滤具有此属性的类型属性。按名称选择要脆弱得多。当然,这只有在您控制有问题的代码时才有可能。 【参考方案1】:

试试这个:

foreach(Assembly asm in AppDomain.CurrentDomain.GetAssemblies())

    if (asm.GetName().Name.EndsWith("static"))
    
        foreach(Type type in asm.GetTypes())
        
            if (type.Name.EndsWith("cache"))
            
                MethodInfo method = type.GetMethod("invalidate", BindingFlags.Static | BindingFlags.Public, null, Type.EmptyTypes, null);
                if (method != null)
                    method.Invoke(null, null);
            
        
    

或者...如果您更喜欢 LINQ:

foreach(MethodInfo method in 
    AppDomain.CurrentDomain
    .GetAssemblies().Where(asm => asm.GetName().Name.EndsWith("static"))
    .SelectMany(asm => asm.GetTypes().Where(type => type.Name.EndsWith("cache"))
    .Select(type => type.GetMethod("invalidate", BindingFlags.Static | BindingFlags.Public, null, Type.EmptyTypes, null)).Where(method => method != null)))
        method.Invoke(null, null);

【讨论】:

以上是关于如何从应用程序域中所有加载的程序集中获取所有静态类并使用反射调用静态方法的主要内容,如果未能解决你的问题,请参考以下文章

从程序集中获取所需的运行时版本

从外部文件或程序集加载 WPF 样式或其他静态资源

查找其他程序集中的所有嵌入资源

从具有依赖关系的另一个文件夹加载另一个应用程序域中的程序集

静态修饰符static,类中的常量定义修饰符

无法从程序集中的所有类型中获取 Span<Type>