@@ -50,8 +50,22 @@ public void Execute(GeneratorExecutionContext context)
5050 continue ;
5151
5252 // 生成注入器代码
53- var source = GenerateInjectorCode ( namespaceName , className , classFullName , httpContextProperty , webSocketProperty ) ;
54- context . AddSource ( $ "{ className } Injector.g.cs", SourceText . From ( source , Encoding . UTF8 ) ) ;
53+ var injectorSource = GenerateInjectorCode ( namespaceName , className , classFullName , httpContextProperty , webSocketProperty ) ;
54+ context . AddSource ( $ "{ className } Injector.g.cs", SourceText . From ( injectorSource , Encoding . UTF8 ) ) ;
55+
56+ // 为每个带有 WebSocketAttribute 的方法生成调用器
57+ var methods = classSymbol . GetMembers ( )
58+ . OfType < IMethodSymbol > ( )
59+ . Where ( m => m . GetAttributes ( ) . Any ( attr =>
60+ attr . AttributeClass ? . Name == "WebSocketAttribute" ||
61+ attr . AttributeClass ? . ToDisplayString ( ) == "Cyaim.WebSocketServer.Infrastructure.Attributes.WebSocketAttribute" ) )
62+ . ToList ( ) ;
63+
64+ foreach ( var method in methods )
65+ {
66+ var methodInvokerSource = GenerateMethodInvokerCode ( namespaceName , className , classFullName , method ) ;
67+ context . AddSource ( $ "{ className } _{ method . Name } Invoker.g.cs", SourceText . From ( methodInvokerSource , Encoding . UTF8 ) ) ;
68+ }
5569 }
5670 }
5771
@@ -98,6 +112,114 @@ private string GenerateInjectorCode(string namespaceName, string className, stri
98112
99113 return sb . ToString ( ) ;
100114 }
115+
116+ private string GenerateMethodInvokerCode ( string namespaceName , string className , string classFullName , IMethodSymbol method )
117+ {
118+ var sb = new StringBuilder ( ) ;
119+ sb . AppendLine ( "using Cyaim.WebSocketServer.Infrastructure.Injectors;" ) ;
120+ sb . AppendLine ( "using System;" ) ;
121+ sb . AppendLine ( ) ;
122+ sb . AppendLine ( $ "namespace { namespaceName } ") ;
123+ sb . AppendLine ( "{" ) ;
124+ sb . AppendLine ( $ " /// <summary>") ;
125+ sb . AppendLine ( $ " /// 源代码生成的方法调用器:{ className } .{ method . Name } ") ;
126+ sb . AppendLine ( $ " /// </summary>") ;
127+ sb . AppendLine ( $ " public class { className } _{ method . Name } Invoker : IMethodInvoker") ;
128+ sb . AppendLine ( " {" ) ;
129+ sb . AppendLine ( " public object Invoke(object instance, object[] args)" ) ;
130+ sb . AppendLine ( " {" ) ;
131+ sb . AppendLine ( $ " if (instance is { classFullName } target)") ;
132+ sb . AppendLine ( " {" ) ;
133+
134+ // 构建方法调用参数
135+ var parameters = method . Parameters ;
136+ var hasParameters = parameters . Length > 0 ;
137+
138+ if ( hasParameters )
139+ {
140+ for ( int i = 0 ; i < parameters . Length ; i ++ )
141+ {
142+ var param = parameters [ i ] ;
143+ var paramType = param . Type . ToDisplayString ( SymbolDisplayFormat . FullyQualifiedFormat ) ;
144+ var paramName = param . Name ;
145+ var isValueType = param . Type . IsValueType ;
146+
147+ // 检查是否为可空值类型 (Nullable<T>)
148+ var isNullable = param . Type is INamedTypeSymbol nullableNamedType &&
149+ nullableNamedType . IsGenericType &&
150+ nullableNamedType . ConstructedFrom ? . ToDisplayString ( ) == "System.Nullable<T>" ;
151+
152+ sb . AppendLine ( $ " var arg{ i } = args.Length > { i } ? args[{ i } ] : null;") ;
153+
154+ if ( isValueType && ! isNullable )
155+ {
156+ // 值类型需要转换
157+ sb . AppendLine ( $ " { paramType } { paramName } ;") ;
158+ sb . AppendLine ( $ " if (arg{ i } == null)") ;
159+ sb . AppendLine ( $ " {{") ;
160+ sb . AppendLine ( $ " { paramName } = default({ paramType } );") ;
161+ sb . AppendLine ( $ " }}") ;
162+ sb . AppendLine ( $ " else if (arg{ i } is { paramType } typed{ i } )") ;
163+ sb . AppendLine ( $ " {{") ;
164+ sb . AppendLine ( $ " { paramName } = typed{ i } ;") ;
165+ sb . AppendLine ( $ " }}") ;
166+ sb . AppendLine ( $ " else") ;
167+ sb . AppendLine ( $ " {{") ;
168+ sb . AppendLine ( $ " { paramName } = ({ paramType } )Convert.ChangeType(arg{ i } , typeof({ paramType } ));") ;
169+ sb . AppendLine ( $ " }}") ;
170+ }
171+ else
172+ {
173+ // 引用类型或可空类型
174+ sb . AppendLine ( $ " var { paramName } = arg{ i } as { paramType } ;") ;
175+ }
176+ }
177+ }
178+
179+ // 构建方法调用
180+ var methodName = method . Name ;
181+ var returnType = method . ReturnType ;
182+ var isVoid = returnType . SpecialType == SpecialType . System_Void ;
183+ var isTask = returnType . Name == "Task" ;
184+ var isTaskOfT = returnType is INamedTypeSymbol taskNamedType &&
185+ taskNamedType . IsGenericType &&
186+ taskNamedType . ConstructedFrom ? . ToDisplayString ( ) == "System.Threading.Tasks.Task<TResult>" ;
187+
188+ sb . Append ( " " ) ;
189+ if ( ! isVoid )
190+ {
191+ sb . Append ( "var result = " ) ;
192+ }
193+ sb . Append ( $ "target.{ methodName } (") ;
194+
195+ if ( hasParameters )
196+ {
197+ var paramNames = parameters . Select ( p => p . Name ) ;
198+ sb . Append ( string . Join ( ", " , paramNames ) ) ;
199+ }
200+
201+ sb . AppendLine ( ");" ) ;
202+
203+ // 处理返回值
204+ if ( isVoid )
205+ {
206+ sb . AppendLine ( " return null;" ) ;
207+ }
208+ else
209+ {
210+ sb . AppendLine ( " return result;" ) ;
211+ }
212+
213+ sb . AppendLine ( " }" ) ;
214+ sb . AppendLine ( ) ;
215+ sb . AppendLine ( " // 如果类型不匹配,返回 null(兼容性回退)" ) ;
216+ sb . AppendLine ( " return null;" ) ;
217+ sb . AppendLine ( " }" ) ;
218+ sb . AppendLine ( " }" ) ;
219+ sb . AppendLine ( "}" ) ;
220+
221+ return sb . ToString ( ) ;
222+ }
101223 }
102224
103225 /// <summary>
0 commit comments