@@ -87,47 +87,56 @@ public static Type GetPacketType(MethodInfo methodInfo)
8787 return expectedPacketType ;
8888 }
8989
90- public static Type GetHandlerInterface ( Type implementationType )
90+ public static Type [ ] GetHandlerInterfaces ( Type implementationType )
9191 {
92- if ( implementationType == null )
93- {
94- throw new ArgumentNullException ( nameof ( implementationType ) ) ;
95- }
92+ ArgumentNullException . ThrowIfNull ( implementationType , nameof ( implementationType ) ) ;
9693
97- return implementationType . GetInterfaces ( )
98- . FirstOrDefault (
94+ var interfaces = implementationType . GetInterfaces ( )
95+ . Where (
9996 interfaceType => interfaceType . IsGenericType &&
10097 interfaceType . GetGenericTypeDefinition ( ) == TypeIPacketHandlerInterface_1
98+ )
99+ . ToArray ( ) ;
100+
101+ if ( interfaces . Length < 1 )
102+ {
103+ throw new ArgumentException (
104+ $ "{ implementationType . GetName ( qualified : true ) } does not directly implement { TypeIPacketHandlerInterface_1 . GetName ( qualified : true ) } ",
105+ nameof ( implementationType )
101106 ) ;
107+ }
108+
109+ return interfaces ;
102110 }
103111
104- public static Type GetPacketType < THandler > ( ) where THandler : IPacketHandler =>
105- GetPacketType ( typeof ( THandler ) ) ;
112+ public static Type [ ] GetPacketTypes < THandler > ( ) where THandler : IPacketHandler =>
113+ GetPacketTypes ( typeof ( THandler ) ) ;
106114
107- public static Type GetPacketType ( Type packetHandlerType )
115+ public static Type [ ] GetPacketTypes ( Type packetHandlerType )
108116 {
109- if ( packetHandlerType == default )
110- {
111- throw new ArgumentNullException ( nameof ( packetHandlerType ) ) ;
112- }
117+ ArgumentNullException . ThrowIfNull ( packetHandlerType , nameof ( packetHandlerType ) ) ;
113118
114- var interfaceType = GetHandlerInterface ( packetHandlerType ) ;
115- if ( interfaceType == null )
119+ var interfaceTypes = GetHandlerInterfaces ( packetHandlerType ) ;
120+ if ( interfaceTypes . Length < 1 )
116121 {
117122 throw new ArgumentException (
118- $ "{ packetHandlerType . FullName } does not implement { TypeIPacketHandlerInterface_1 . FullName } .",
123+ $ "{ packetHandlerType . GetName ( qualified : true ) } does not implement { TypeIPacketHandlerInterface_1 . GetName ( qualified : true ) } .",
119124 nameof ( packetHandlerType )
120125 ) ;
121126 }
122127
123- var packetTypeFromType = interfaceType . GenericTypeArguments . FirstOrDefault ( ) ;
124- if ( packetTypeFromType . IsInterface ||
125- packetTypeFromType . IsAbstract ||
126- packetTypeFromType . IsGenericType ||
127- ! TypeIPacket . IsAssignableFrom ( packetTypeFromType ) )
128+ var genericTypeArguments = interfaceTypes . SelectMany ( interfaceType => interfaceType . GenericTypeArguments ) . Distinct ( ) . ToArray ( ) ;
129+ var packetTypesFromType = genericTypeArguments . Where (
130+ packetTypeFromType =>
131+ packetTypeFromType is { IsInterface : false , IsAbstract : false , IsGenericType : false } &&
132+ packetTypeFromType . Extends ( TypeIPacket )
133+ )
134+ . ToArray ( ) ;
135+
136+ if ( packetTypesFromType . Length < 1 )
128137 {
129138 throw new ArgumentException (
130- $ "Invalid packet generic type ( { packetTypeFromType . FullName } ) in handler declaration ' { packetHandlerType . FullName } '. ",
139+ $ "{ packetHandlerType . GetName ( qualified : true ) } handles no packet types ",
131140 nameof ( packetHandlerType )
132141 ) ;
133142 }
@@ -136,17 +145,20 @@ public static Type GetPacketType(Type packetHandlerType)
136145 GetCustomAttribute ( packetHandlerType , typeof ( PacketHandlerAttribute ) ) as PacketHandlerAttribute ;
137146
138147 var packetTypeFromAttribute = packetHandlerAttribute ? . PacketType ;
139- var expectedPacketType = packetTypeFromAttribute ?? packetTypeFromType ;
148+ var expectedPacketTypes = packetTypeFromAttribute == null ? packetTypesFromType : [ packetTypeFromAttribute ] ;
140149
141- if ( packetTypeFromType != expectedPacketType )
150+ if ( ! packetTypesFromType . SequenceEqual ( expectedPacketTypes ) )
142151 {
152+ var packetHandlerTypeName = packetHandlerType . GetName ( qualified : true ) ;
153+ var packetTypeNames = string . Join ( ", " , packetTypesFromType . Select ( type => type . GetName ( qualified : true ) ) ) ;
154+ var expectedPacketTypeNames = string . Join ( ", " , expectedPacketTypes . Select ( type => type . GetName ( qualified : true ) ) ) ;
143155 throw new ArgumentException (
144- $ "{ packetHandlerType . FullName } is a packet handler for { packetTypeFromType . FullName } but is marked with an attribute for { packetTypeFromAttribute . FullName } .",
156+ $ "{ packetHandlerTypeName } is a packet handler for { packetTypeNames } but is marked with an attribute for { expectedPacketTypeNames } .",
145157 nameof ( packetHandlerType )
146158 ) ;
147159 }
148160
149- return expectedPacketType ;
161+ return expectedPacketTypes ;
150162 }
151163
152164 public static bool IsValidHandler ( MethodInfo methodInfo )
@@ -186,7 +198,7 @@ public static bool IsValidHandler(Type type)
186198
187199 try
188200 {
189- return GetPacketType ( type ) != default ;
201+ return GetPacketTypes ( type ) . Length > 0 ;
190202 }
191203 catch ( ArgumentNullException )
192204 {
0 commit comments