我有2个方法,intMethod和doubleMethod,它们是完全相同的,除了intMethod需要一个int数组参数和doubleMethod需要一个double数组参数。

我知道我可以使用重载来使用相同的方法名称,但是,我仍然得到2种几乎完全相同的方法,只是它们的参数有所不同。无论如何,我可以将intMethod和doubleMethod组合为1方法吗?

如果可以,请提供一些示例代码吗?我可以通过一些示例代码更好地遵循。谢谢

编辑:人们要求我发布我的方法,然后您就可以了:

我有一个相同的方法readDataDouble,该数据数组为double [] []

基本上,此方法读取CSV文件并将数据转换为int格式。第一行是时间,第一列是日期。

    public static void readDataInt(string value, ref int[][] data, ref DateTime[] timeframe, ref DateTime[] date)
    {
        string inputFile = "D:\\temp.csv";
        string[][] temp = null;

        if (File.Exists(inputFile))
        {
            string[] proRataVolumeFile = File.ReadAllLines(inputFile);
            temp = new string[proRataVolumeFile.Length][];

            for (int i = 0; i < proRataVolumeFile.Length; i++)
            {
                temp[i] = proRataVolumeFile[i].Split(',');
            }
        }

              //convert the string to int

        date = new DateTime[temp.Length - 1];
        timeframe = new DateTime[temp[0].Length - 1];
        data = new int[temp.Length - 1][];

        for (int i = 1; i < temp.Length; i++)
        {
            data[i - 1] = new int[temp[i].Length - 1];

            for (int j = 1; j < temp[i].Length; j++)
            {
                if (temp[i][j].Length > 0)
                    data[i - 1][j - 1] = Convert.ToInt32(temp[i][j]);
            }
        }

        for (int i = 1; i < temp.Length; i++)
        {
            date[i - 1] = Convert.ToDateTime(temp[i][0]);
        }

        for (int j = 1; j < temp[0].Length; j++)
        {
            timeframe[j - 1] = DateTime.Parse(temp[0][j]);
        }
    }

最佳答案

这很大程度上取决于方法本身的作用。

如果可以使用共享接口(例如IComparable<T>)编写该方法,则可以将其设为generic method

void SomeMethod<T>(T[] values) where T : IComparable<T>
{
    // Do stuff here
}


但是,这将更具限制性,因为您只能使用由通用约束定义的方法或属性。它适用于需要比较值或检查相等性的事情,但不适用于“通用数学”,因为没有可用的共享接口(例如理论上的IArithmetic<T>接口)。

编辑:在您的情况下,您应该能够使用受限于IConvertible实现的通用方法:

public static void ReadData<T>(string value, ref T[][] data, ref DateTime[] timeframe, ref DateTime[] date) where T : IConvertible
{




另一个选择是声明您的方法使用dynamic而不是特定类型:

dynamic SomeMethod(dynamic[] values)
{
    dynamic result = values[0];
    for (int i = 1; i < values.Length; ++i)
         result = result + values[i]; // You can use normal operators now
    return result;
}


这适用于任何类型,但是检查使用动态绑定,因此可以有效地移至运行时。如果传递的类型不能正常工作,则将获得运行时异常(而不是编译时检查)。

10-08 20:28