From b2f46a56ea908c81a60377a7d59306a5ece08298 Mon Sep 17 00:00:00 2001 From: ScottNZ Date: Fri, 15 Nov 2013 21:56:23 +1300 Subject: [PATCH] Add FindType method to ObjectCreator --- OpenRA.Game/ObjectCreator.cs | 46 +++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/OpenRA.Game/ObjectCreator.cs b/OpenRA.Game/ObjectCreator.cs index e7a54ab96a..cdf01b0a21 100755 --- a/OpenRA.Game/ObjectCreator.cs +++ b/OpenRA.Game/ObjectCreator.cs @@ -19,13 +19,15 @@ namespace OpenRA { public class ObjectCreator { - Pair[] modAssemblies; + Pair[] assemblies; public ObjectCreator(Manifest manifest) { // All the core namespaces - var asms = typeof(Game).Assembly.GetNamespaces() + var asms = typeof(Game).Assembly.GetNamespaces() // Game .Select(c => Pair.New(typeof(Game).Assembly, c)) + .Concat(typeof(Mod).Assembly.GetNamespaces() // FileFormats + .Select(c => Pair.New(typeof(Mod).Assembly, c))) .ToList(); // Namespaces from each mod assembly @@ -35,7 +37,7 @@ namespace OpenRA asms.AddRange(asm.GetNamespaces().Select(ns => Pair.New(asm, ns))); } - modAssemblies = asms.ToArray(); + assemblies = asms.ToArray(); } public static Action MissingTypeAction = @@ -48,24 +50,30 @@ namespace OpenRA public T CreateObject(string className, Dictionary args) { - foreach (var mod in modAssemblies) + var type = FindType(className); + if (type == null) { - var type = mod.First.GetType(mod.Second + "." + className, false); - if (type == null) continue; - var flags = BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance; - var ctors = type.GetConstructors(flags) - .Where(x => x.HasAttribute()).ToList(); - - if (ctors.Count == 0) - return (T)CreateBasic(type); - else if (ctors.Count == 1) - return (T)CreateUsingArgs(ctors[0], args); - else - throw new InvalidOperationException("ObjectCreator: UseCtor on multiple constructors; invalid."); + MissingTypeAction(className); + return default(T); } - MissingTypeAction(className); - return default(T); + var flags = BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance; + var ctors = type.GetConstructors(flags) + .Where(x => x.HasAttribute()).ToList(); + + if (ctors.Count == 0) + return (T)CreateBasic(type); + else if (ctors.Count == 1) + return (T)CreateUsingArgs(ctors[0], args); + else + throw new InvalidOperationException("ObjectCreator: UseCtor on multiple constructors; invalid."); + } + + public Type FindType(string className) + { + return assemblies + .Select(pair => pair.First.GetType(pair.Second + "." + className, false)) + .FirstOrDefault(t => t != null); } public object CreateBasic(Type type) @@ -90,7 +98,7 @@ namespace OpenRA public IEnumerable GetTypesImplementing() { var it = typeof(T); - return modAssemblies.Select(ma => ma.First).Distinct() + return assemblies.Select(ma => ma.First).Distinct() .SelectMany(ma => ma.GetTypes() .Where(t => t != it && it.IsAssignableFrom(t))); }