From e96ff34af9609573eed0e1f2ed7e88ce94c3b028 Mon Sep 17 00:00:00 2001 From: Mikhail <99481254+DCFApixels@users.noreply.github.com> Date: Wed, 29 Mar 2023 23:34:19 +0800 Subject: [PATCH] Add exceptions for incorrect Runner implementations. --- src/EcsRunner.cs | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/src/EcsRunner.cs b/src/EcsRunner.cs index 70a7109..2b514f0 100644 --- a/src/EcsRunner.cs +++ b/src/EcsRunner.cs @@ -27,15 +27,10 @@ namespace DCFApixels.DragonECS } } - [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = true)] - sealed class MyAttribute : Attribute - { - - } - public interface IEcsSystem { } public interface IEcsRunner { + public EcsSystems Source { get; } public IList Targets { get; } public object Filter { get; } public bool IsHasFilter { get; } @@ -83,7 +78,8 @@ namespace DCFApixels.DragonECS _runnerHandlerTypes = new Dictionary(); foreach (var item in runnerHandlerTypes) { - Type interfaceType = item.GetInterfaces().Where(o => o != typeof(IEcsRunner) && o != typeof(IEcsSystem)).First(); //TODO оптимизировать это место + //Type interfaceType = item.GetInterfaces().Where(o => o != typeof(IEcsRunner) && o != typeof(IEcsSystem)).First(); //TODO оптимизировать это место + Type interfaceType = item.BaseType.GenericTypeArguments[0]; _runnerHandlerTypes.Add(interfaceType.GUID, item); } @@ -95,13 +91,24 @@ namespace DCFApixels.DragonECS private static Exception CheckRunnerValide(Type type) //TODO доработать проверку валидности реалиазации ранера { - if (type.ReflectedType != null) - return new Exception($"{type.FullName}.ReflectedType must be Null, but equal to {type.ReflectedType.FullName}"); + Type baseType = type.BaseType; + Type baseTypeArgument = baseType.GenericTypeArguments[0]; - //var interfaces = type.GetInterfaces(); - //if (interfaces.Length != 1 || interfaces[0].GUID != typeof()) - //{ - //} + if (type.ReflectedType != null) + { + return new Exception($"{type.FullName}.ReflectedType must be Null, but equal to {type.ReflectedType.FullName}."); + } + if (!baseTypeArgument.IsInterface) + { + return new Exception($"Argument T of class EcsRunner, can only be an inetrface.The {baseTypeArgument.FullName} type is not an interface."); + } + + var interfaces = type.GetInterfaces(); + + if (!interfaces.Any(o => o == baseTypeArgument)) + { + return new Exception($"Runner {type.FullName} does not implement interface {baseTypeArgument.FullName}."); + } return null; }