-1

我有这两个功能

private void calcResults()
{
   MakePath(id, results, _resultCount);
   MakePath(id, "XYZ", _resultSICount)
}

private string MakePath(string subFolder, object obj, int index)
{
    string dir = System.IO.Path.Combine(_outputDir, subFolder);
    string fileName = string.Format("{0} {1} {2}.xml",
           obj.GetType().Name, _dateTimeSource.Now.ToString(DATE_FORMAT), index.ToString());
    return System.IO.Path.Combine(dir, fileName);
}

private string MakePath(string subFolder, string tempFileName, int index)
{
    string dir = System.IO.Path.Combine(_outputDir, subFolder);
    string fileName = string.Format("{0} {1} {2}.xml",
           tempFileName, _dateTimeSource.Now.ToString(DATE_FORMAT), index.ToString());
    return System.IO.Path.Combine(dir, fileName);
}

请有人帮忙。

谢谢

4

5 回答 5

7

如果我正确理解你的问题,你的意思是你想重载方法以避免代码重复......这就是我的处理方式。

    private void calcResults()
    {
       MakePath(id, results.GetType(), _resultCount);
       MakePath(id, "XYZ", _resultSICount)
    }

    private string MakePath(string subFolder, Type type, int index)
    {
        return MakePath(subFolder, type.Name, index);
    }

    private string MakePath(string subFolder, string tempFileName, int index)
    {
        string dir = System.IO.Path.Combine(_outputDir, subFolder);
        string fileName = string.Format("{0} {1} {2}.xml",
               tempFileName, _dateTimeSource.Now.ToString(DATE_FORMAT), index.ToString());
        return System.IO.Path.Combine(dir, fileName);
    }

我会避免使用 object 作为您的第二个参数的类型,因为在这种情况下似乎模棱两可,使用 Type 表示参数的预期用途。

于 2013-03-18T14:40:25.597 回答
2

你可以考虑这样的事情:

    private string MakePath(string subFolder, object obj, int index)
    {        
        //tempFileName here is created beased on the TYPE of the object passed
        string tempFileName = obj.GetType().Name;
        return MakePath(subFolder,tempFileName , index); 

    }

    private string MakePath(string subFolder, string tempFileName, int index)
    {
        //combine directory path
        string dir = System.IO.Path.Combine(_outputDir, subFolder);

        //compute final file name based on the several 
        //parameters and tempFileName parameter
        string fileName = string.Format("{0} {1} {2}.xml",
            tempFileName, _dateTimeSource.Now.ToString(DATE_FORMAT), index.ToString());

        return System.IO.Path.Combine(dir, fileName);
    }

按照所呈现代码的逻辑,如果我错了,请纠正我,这两种方法之间的唯一区别是,首先tempFileName是基于类型 name,而在第二个中,它只是调用者传递的第二个参数.

于 2013-03-18T14:28:34.297 回答
0

这里的问题是字符串也是一个对象,所以编译器无法选择使用什么方法。您可以更改参数顺序,或重命名其中一种方法。

于 2013-03-18T14:29:03.777 回答
0
private string MakePath(string subFolder, object obj, int index)
{
    if(obj.GetType()==typeof(string))
    {
        //copy the strong typed version to here;
        return;
    }
    string dir = System.IO.Path.Combine(_outputDir, subFolder);
    string fileName = string.Format("{0} {1} {2}.xml",
        obj.GetType().Name, _dateTimeSource.Now.ToString(DATE_FORMAT), index.ToString());
    return System.IO.Path.Combine(dir, fileName);
}

然后,您可以使用一项功能完成两项工作。这会吗?

于 2013-03-18T14:29:29.443 回答
0

您可以将“结果”值转换为对象:

class Program
{
    static void Main(string[] args)
    {

        var ret1 = GetValue("String");
        Console.WriteLine(ret1);
        var ret2 = GetValue((object)"test");
        Console.WriteLine(ret2);

        Console.ReadKey();
    }

    private static object GetValue(string p0)
    {
        return p0;
    }

    private static object GetValue(object p0)
    {
        return "Object";
    }
}

对 GetValue 的第二次调用被路由到带有对象参数的那个。

于 2013-03-18T14:35:21.193 回答