【问题标题】:Find all classes that derive from type and activate that type查找从类型派生的所有类并激活该类型
【发布时间】:2015-12-24 13:13:30
【问题描述】:

我已经看过一些类似的答案,但我无法让它发挥作用。

我正在尝试使以下内容更易于维护:

var modules = new INinjectModule[]
{
    new ServiceModule(),
    new ApplicationSettingsModule(),
    new SerializerModule(),
    new LoggerModule(),
    new SqliteModule(),
    new SetupModule(), 
    new CacheModule(), 
    new AuthenticationModule(), 
};

每次我添加一个新的NinjectModule 时,我都需要修改这个数组以包含它。

我希望能够找到从NinjectModule 派生的所有类型并激活它们并将它们全部放入一个集合中。

这是我尝试过的,但我没有得到任何派生自 NinjectModule 的类

var classes = (from domainAssembly in AppDomain.CurrentDomain.GetAssemblies()
                from assemblyType in domainAssembly.GetTypes()
                where typeof(NinjectModule).IsAssignableFrom(assemblyType)
                select assemblyType).ToArray();

请注意,我要查找的类位于不同的程序集中...

【问题讨论】:

  • AppDomain.CurrentDomain.GetAssemblies() 仅返回在您调用它时已加载的程序集(请参阅stackoverflow.com/a/10284950/292411) - 您可以检查此时是否包含包含所需类型的程序集

标签: c# reflection ninject


【解决方案1】:

我建议你使用这样的内核,所以 Ninject 会注意NinjectModules:

public static IKernel ConfigureKernel(IKernel kernel)
{
      kernel.Load(Assembly.Load("NZBDash.DependencyResolver.Modules"));
      return kernel;
}

【讨论】:

    【解决方案2】:

    修复它。

    我用Assembly.Load():

    var result = Assembly.Load("NZBDash.DependencyResolver.Modules").GetTypes()
                   .Where(a => 
                   a.IsClass &&
                   a.BaseType == typeof(NinjectModule))
                   .ToArray();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-30
      • 1970-01-01
      • 2011-11-19
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多