You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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());
    }
}

方案说明

  1. 优先级判断:先判断int再判断float,避免能转成int的参数被错误识别为float类型
  2. 逻辑简化:去掉多层嵌套if,每个转换判断独立,成功后直接执行加法并返回,无需继续后续判断
  3. 边界处理:增加参数数量检查,防止因传入参数不足导致数组越界异常
  4. 泛型复用:原泛型类通过dynamic自动适配数值相加和字符串拼接的+运算符逻辑,无需额外修改

内容的提问来源于stack exchange,提问作者ADAM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 12:52:49