C#动态调用可接受null的字符串参数方法问题求助
修复反射调用接受string?参数的方法失败问题
你的问题出在反射调用时的参数匹配逻辑错误:
- 当命令无参数时,
Command.args.ToArray()生成空数组,但你的方法需要一个string?参数,Invoke无法匹配到对应重载。 - 当命令有多个参数时,
Invoke会把数组中每个元素作为独立参数传递,而你的方法仅接受单个参数,导致参数数量不匹配。 - 未指定参数类型获取方法,可能出现重载匹配偏差。
修改后的代码
public class Command { public static void Interpret(AST.Command Command) { if (Command.command == null) return; // 明确指定参数类型,精准获取目标方法 var targetMethod = typeof(Interpreter.Command).GetMethod( Command.command, new[] { typeof(string?) } ); if (targetMethod == null) return; // 构建匹配方法参数的数组:始终传递单个元素(参数或null) object[] invokeParams = Command.args?.Any() == true ? new object[] { Command.args.FirstOrDefault() } : new object[] { null }; targetMethod.Invoke(null, invokeParams); } public static void quit(string? args) { System.Environment.Exit(1); } public static void info(string? args) { Console.WriteLine("MathDoer Info :\n\tVersion : 0.0.1\n\tBy : Wiazarr"); } }
核心修复说明
- 精确匹配方法:通过
GetMethod的参数类型指定,确保找到接受string?的方法重载,避免匹配错误。 - 统一参数格式:无论命令有无参数,都构建包含一个元素的参数数组:
- 无参数时传递
null(符合string?的类型要求) - 有参数时取第一个参数传递(若需支持多参数拼接,可改为
string.Join(" ", Command.args))
- 无参数时传递
- 增加空值判断,避免空引用异常。
内容的提问来源于stack exchange,提问作者Wiazarr
相关产品推荐
相关产品推荐

