74 lines
1.8 KiB
C#

using System;
using System.Collections.Generic;
using System.Reflection;
namespace ANXStatusComparer.Data
{
/// <summary>
/// Assemblies data holder which preparses the loaded assemblies, like
/// collecting the namespaces, etc.
/// </summary>
public class AssembliesData
{
#region Public
/// <summary>
/// All namespaces of the assemblies.
/// </summary>
public Dictionary<string, NamespaceData> Namespaces
{
get;
private set;
}
#endregion
#region Constructor
/// <summary>
/// Create a new Assembly data holder from the specified filepath and
/// assembly type.
/// </summary>
/// <param name="filepaths">Filepaths to the assemblies to load.</param>
public AssembliesData(string[] filepaths)
{
if (filepaths == null)
{
return;
}
Namespaces = new Dictionary<string, NamespaceData>();
foreach (string file in filepaths)
{
Assembly assembly = Assembly.LoadFile(file);
Type[] types = new Type[0];
try
{
// First of all collect all types from the assembly.
types = assembly.GetTypes();
}
catch (ReflectionTypeLoadException ex)
{
// If loading all types failed, we can still get all the types
// that were already sucessfully extracted.
types = ex.Types;
}
// Now collect the namespaces from the types.
foreach (Type type in types)
{
if (String.IsNullOrEmpty(type.Namespace))
continue;
if (Namespaces.ContainsKey(type.Namespace) == false)
Namespaces.Add(type.Namespace, new NamespaceData(type.Namespace));
Namespaces[type.Namespace].AllTypes.Add(type);
}
}
foreach (string key in Namespaces.Keys)
Namespaces[key].ParseTypes();
}
#endregion
}
}