如何在C#中判断命令行参数类型并实现通用加法功能
问题描述
我想开发一个程序,能对传入的两个命令行参数执行“加法”操作——如果是数字就做数值相加,如果有非数字就做字符串拼接。现在用一堆if语句逐个判断类型,代码太冗余;试过用GetType()获取参数类型,但因为命令行参数本身是string数组,结果永远是string。现在需要更优的实现方案,基于泛型类extensionMethods<T>来实现对应类型的加法逻辑,预期效果:
- 当参数是
1和2时,输出3 - 当参数是
1和a时,输出1a - 当参数是
a和b时,输出ab
现有代码如下:
原extensionMethods.cs
public class extensionMethods<T> { public T argument1 { get; set; } public T argument2 { get; set; } public T Add() { dynamic dynamicArg1 = argument1; dynamic dynamicArg2 = argument2; return dynamicArg1 + dynamicArg2; } }
原Program.cs
internal class Program { static void Main(string[] args) { var argument1 = args[0]; var argument2 = args[1]; /* 始终返回String ! Type argType = args[0].GetType(); Console.WriteLine(argType); */ if (float.TryParse(args[0], out float argument1Int) && float.TryParse(args[1], out float argument2Int)) { extensionMethods<float> obj = new extensionMethods<float>(); obj.argument1 = argument1Int; obj.argument2 = argument2Int; Console.WriteLine(obj.Add()); } else if ( int.TryParse(args[0], out int argument1Int) && int.TryParse(args[1], out int argument2Int)) { extensionMethods<int> obj = new extensionMethods<int>(); obj.argument1 = argument1Int; obj.argument2 = argument2Int; Console.WriteLine(obj.Add()); } ... else { extensionMethods<string> obj = new extensionMethods<string>(); obj.argument1 = args[0]; obj.argument2 = args[1]; Console.WriteLine(obj.Add()); } } } }
优化方案
核心思路是按优先级尝试将字符串参数转换为数值类型,转换失败则默认走字符串拼接逻辑,同时简化冗余的类型判断代码,复用原有的泛型类逻辑。
优化后代码
extensionMethods.cs(无需修改)
public class extensionMethods<T> { public T argument1 { get; set; } public T argument2 { get; set; } public T Add() { dynamic dynamicArg1 = argument1; dynamic dynamicArg2 = argument2; return dynamicArg1 + dynamicArg2; } }
Program.cs(简化类型判断逻辑)
internal class Program { static void Main(string[] args) { // 先检查参数数量,避免数组越界 if (args.Length < 2) { Console.WriteLine("请传入两个参数"); return; } var arg1 = args[0]; var arg2 = args[1]; // 优先尝试转换为int(int是float的子集,避免误判) if (int.TryParse(arg1, out int intVal1) && int.TryParse(arg2, out int intVal2)) { var intAdder = new extensionMethods<int> { argument1 = intVal1, argument2 = intVal2 }; Console.WriteLine(intAdder.Add()); return; } // 再尝试转换为float if (float.TryParse(arg1, out float floatVal1) && float.TryParse(arg2, out float floatVal2)) { var floatAdder = new extensionMethods<float> { argument1 = floatVal1, argument2 = floatVal2 }; Console.WriteLine(floatAdder.Add()); return; } // 转换失败,默认按字符串拼接处理 var stringAdder = new extensionMethods<string> { argument1 = arg1, argument2 = arg2 }; Console.WriteLine(stringAdder.Add()); } }
方案说明
- 优先级判断:先判断int再判断float,避免能转成int的参数被错误识别为float类型
- 逻辑简化:去掉多层嵌套if,每个转换判断独立,成功后直接执行加法并返回,无需继续后续判断
- 边界处理:增加参数数量检查,防止因传入参数不足导致数组越界异常
- 泛型复用:原泛型类通过
dynamic自动适配数值相加和字符串拼接的+运算符逻辑,无需额外修改
内容的提问来源于stack exchange,提问作者ADAM
相关产品推荐
相关产品推荐

