using System; using System.IO; using System.Linq; using System.Reflection; using OpenRA.FileFormats; namespace OpenRA { public class ObjectCreator { Pair[] ModAssemblies; public ObjectCreator( Manifest manifest ) { // All the core namespaces var asms = typeof(Game).Assembly.GetNamespaces() .Select(c => Pair.New(typeof(Game).Assembly, c)) .ToList(); // Namespaces from each mod assembly foreach (var a in manifest.Assemblies) { var asm = Assembly.LoadFile(Path.GetFullPath(a)); asms.AddRange(asm.GetNamespaces().Select(ns => Pair.New(asm, ns))); } ModAssemblies = asms.ToArray(); } public static Action MissingTypeAction = s => { throw new InvalidOperationException("Cannot locate type: {0}".F(s)); }; public T CreateObject(string classname) { foreach (var mod in ModAssemblies) { var fullTypeName = mod.Second + "." + classname; var obj = mod.First.CreateInstance(fullTypeName); if (obj != null) return (T)obj; } MissingTypeAction(classname); return default(T); } } }