Provides a helper method for instantiating all types within the app domain that implement an interface
/// <summary>
/// Initializes a collection of types that implement an interface.
/// </summary>
/// <typeparam name="T">The interface type to check for.</typeparam>
/// <param name="loadingErrors">The loading errors that may have occurred.</param>
/// <returns>A list of type <see cref="T"/>.</returns>
public IEnumerable<T> GetPlugins<T>(out IEnumerable<Exception> loadingErrors)
{
// search for types in each assembly that implement the type
var fullName = typeof(T).FullName;
var list = new List<T>();
var errors = new List<Exception>();
// search through all assemblies
foreach (var asm in AppDomain.CurrentDomain.GetAssemblies())
{
// search through all types
foreach (var type in asm.GetTypes())
{
// ignore abstract classes
if (type.IsAbstract)
{
continue;
}
// get interfaces that the type implements
foreach (var inter in type.GetInterfaces())
{
try
{
// check if type implements interface
if (string.CompareOrdinal(inter.FullName, fullName) == 0)
{
// create/add type to list
var obj = asm.CreateInstance(type.FullName);
var instance = (T)obj;
list.Add(instance);
}
}
catch (Exception ex)
{
// record error
errors.Add(ex);
}
}
}
}
loadingErrors = errors;
return list;
}