Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从应用程序域中所有加载的程序集中获取所有静态类,并使用反射调用静态方法_C#_Appdomain_System.reflection - Fatal编程技术网

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

C# 如何从应用程序域中所有加载的程序集中获取所有静态类,并使用反射调用静态方法,c#,appdomain,system.reflection,C#,Appdomain,System.reflection,我的要求如下,这可能吗?如果是,有人能告诉我这方面的资源吗 从中获取以单词“static”结尾的所有程序集 应用程序域 获取以单词“cache”结尾的静态类 从从步骤1检索的程序集 从类中执行名为“invalidate”的静态方法 从步骤2中检索 试试这个: foreach(Assembly asm in AppDomain.CurrentDomain.GetAssemblies()) { if (asm.GetName().Name.EndsWith("static")) {

我的要求如下,这可能吗?如果是,有人能告诉我这方面的资源吗

  • 从中获取以单词“static”结尾的所有程序集 应用程序域
  • 获取以单词“cache”结尾的静态类 从从步骤1检索的程序集
  • 从类中执行名为“invalidate”的静态方法 从步骤2中检索
  • 试试这个:

    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);
    

    你想解决什么问题?这听起来对我不合适。为什么不能在代码中直接调用这些方法呢。你为什么需要反思?这是插件模型吗?解决此类问题的更好方法通常是要求对象集中注册自己,或者(如果必须有静态类)应用自定义属性并使用
    attribute.GetCustomAttribute()
    筛选具有此属性的类型。按名称选择要脆弱得多。当然,这只有在您控制有问题的代码时才可能。