#region License Information
/* HeuristicLab
* Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
*
* This file is part of HeuristicLab.
*
* HeuristicLab is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* HeuristicLab is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with HeuristicLab. If not, see .
*/
#endregion
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
namespace HeuristicLab.PluginInfrastructure {
///
/// Provides convenience methods to find specific types or to create instances of types.
///
public class DiscoveryService {
public PluginInfo[] Plugins {
get {
PluginInfo[] plugins = new PluginInfo[PluginManager.Manager.LoadedPlugins.Count];
PluginManager.Manager.LoadedPlugins.CopyTo(plugins, 0);
return plugins;
}
}
///
/// Find all types that are subtypes or equal to the specified type.
///
/// Most general type for which to find matching types.
///
public Type[] GetTypes(Type type) {
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
List types = new List();
foreach(Assembly asm in assemblies) {
Array.ForEach(GetTypes(type, asm), delegate(Type t) {
types.Add(t);
});
}
return types.ToArray();
}
///
/// Create an instance of all types that are subtypes or the same type of the specified type
///
/// Most general type.
///
public T[] GetInstances() where T : class {
Type[] types = GetTypes(typeof(T));
List instances = new List();
foreach(Type t in types) {
if(!t.IsAbstract && !t.IsInterface && !t.HasElementType) {
instances.Add((T)Activator.CreateInstance(t));
}
}
return instances.ToArray();
}
public Type[] GetTypes(Type type, PluginInfo plugin) {
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
List types = new List();
foreach(Assembly asm in assemblies) {
if(plugin.Assemblies.Contains(asm.Location)) {
Array.ForEach(GetTypes(type, asm), delegate(Type t) {
types.Add(t);
});
}
}
return types.ToArray();
}
///
/// Get instances of all types that implement the specified interface only in the given assembly.
///
/// Interface type.
/// Assembly that should be searched for types.
///
internal T[] GetInstances(Assembly assembly) {
Type[] types = GetTypes(typeof(T), assembly);
List instances = new List();
foreach(Type t in types) {
if(!t.IsAbstract && !t.IsInterface && !t.HasElementType) {
instances.Add((T)Activator.CreateInstance(t));
}
}
return instances.ToArray();
}
///
/// Get types that are assignable (same of subtype) to the specified type only from the given assembly.
///
/// Most general type we want to find.
/// Assembly that should be searched for types.
///
internal Type[] GetTypes(Type type, Assembly assembly) {
List types = new List();
foreach(Type t in assembly.GetTypes()) {
if(type.IsAssignableFrom(t)) {
types.Add(t);
}
}
return types.ToArray();
}
public PluginInfo GetDeclaringPlugin(Type type) {
IPlugin[] plugins = GetInstances(type.Assembly);
if(plugins.Length != 1) return null;
IPlugin plugin = plugins[0];
foreach(PluginInfo info in PluginManager.Manager.LoadedPlugins) {
if(info.Name == plugin.Name && info.Version == plugin.Version) return info;
}
return null;
}
}
}