-1

私はこれらの2つの機能を持っています

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);
    }

この場合はあいまいに見えるため、2番目のパラメーターのタイプとしてオブジェクトを使用することは避けます。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);
    }

提示されたコードのロジックに従って、間違っている場合は修正してください。これら 2 つのメソッドの唯一の違いは、最初は型名に基づいtempFileNameており、2 番目は呼び出し元から渡された単なる 2 番目のパラメーターであることです。.

于 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);
}

その後、1 つの関数を使用して 2 つのジョブを実行できます。これでうまくいきますか?

于 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 への 2 番目の呼び出しは、オブジェクト パラメータを持つものにルーティングされます。

于 2013-03-18T14:35:21.193 に答える