public override void Initialize() { base.Initialize(); foreach (var system in AppDomain.CurrentDomain.GetAssemblies() .SelectMany(a => a.GetTypes() .Where(t => t.GetCustomAttributes(true).Any(at => at.GetType() == typeof(ComponentSystemAttribute))))) { var obj = (ComponentSystem)Activator.CreateInstance(system); obj.Game = Game; var requiredComponents = new List <Type>(); foreach (var attr in system.GetCustomAttributes(typeof(RequiredComponentsAttribute), true) as RequiredComponentsAttribute[]) { requiredComponents.AddRange(attr.RequiredComponents); } var contract = new ComponentSystemContract(obj, requiredComponents.ToArray()); if (!_componentSystems.TryAdd(system, contract)) { throw new ArgumentException("A system with this type is already defined."); } } }
public T RegisterSystem <T>() where T : ComponentSystem, new() { var type = typeof(T); var obj = new T(); obj.Game = Game; var requiredComponents = new List <Type>(); foreach (var attr in typeof(T).GetCustomAttributes(typeof(RequiredComponentsAttribute), true) as RequiredComponentsAttribute[]) { requiredComponents.AddRange(attr.RequiredComponents); } var contract = new ComponentSystemContract(obj, requiredComponents.ToArray()); if (!_componentSystems.TryAdd(type, contract)) { throw new ArgumentException("A system with this type is already defined."); } return(obj); }