【问题标题】: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
【问题描述】:

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

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

【问题讨论】:

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

标签: c# appdomain system.reflection


【解决方案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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-30
    • 1970-01-01
    • 2020-04-15
    • 1970-01-01
    相关资源
    最近更新 更多