1

古い質問
だから、これは私が達成しようとしていることです...

私は既存の抽象クラスを持っています.. Class1.cs という名前を付けます。多くのメソッドの定義が含まれています。そのため、Class1 クラスのすべてのメソッドに実装する必要があるいくつかの新しい機能を含めました。だから例の-

        public void Method_1(string arg1, string arg2)
        {
           /*
           //some code implementation specific to Method_1
           */
           Dictionary<string, object> dict= new Dictionary<string, object>();
           //there can be more or less arguments in other methods
           dict.Add("Arg1", arg1);
           dict.Add("Arg2", arg2);
           Method_2(dict);
        }

すべてのメソッドでまったく同じことを行う必要がありますが、引数は異なる場合があります。したがって、辞書オブジェクトには「n」個のパラメーターを含めることができます。同じコードを繰り返し追加する手作業を回避できる方法はありますか (可能であればデザインパターンを使用してください)。

私は明確ではないと思います...辞書生成メカニズムをバンドルすることは私の関心事ではありません.すべてのメソッド(約50)に同じコードを追加する必要があります..同じコードを手動で再度呼び出すことを避けようとしていますそしてまた50回…

質問
を編集して再構成しました。最終的に、プライベート メソッドで辞書を作成し、それを他のすべてのメソッドで呼び出すことにしました。この段落の前にあるものはすべて無視してください。私の方法は次のようになります

public void Method1(string a, string b , string c)
{ 
   Dictionary<string,object> dict = BuildDictionary(new {a, b ,c}); 
   /*the dict object should have the following structure
                           key=a,   value=  value of a 
                           key =b , value = value of b
                           key =b , value = value of b*/
}
public void Method2(string x, string y)
{ 
   Dictionary<string,object> dict = BuildDictionary(new {x,y}); 
   /*the dict object should have the following structure
                           key= x,  value=  value of x 
                           key =y , value = value of y */
}
private Dictionary<string,object> BuildDictionary(params object[] values)
{
   //values.ToString() gives  = { a= "Value of a", b== "Vaue of b", c= "Value of c"}
   //Copy pasting Simon's Code here(use of anonymous objects)
   var dictionary = values.GetType()
                       .GetProperties()
                       .ToDictionary(pi => pi.Name, pi => pi.GetValue(values));
   //this dictionary object gives me a count of 7 with keys as the properties of the object datatype(which is not relevant to my case). 
}

では、目的の辞書構造を取得するには、BuildDictionary メソッドにどのような変更を加える必要があるでしょうか?

4

4 に答える 4

3

Method_2 の性質とディクショナリ内のキーが何を表しているかについての情報があまりないため、2 つのオプションを提案します。

キーは常に Arg + N を表します

この場合、Method_2 の署名はparams

public void Method_2(params object[] values)
{
    var argNo = 0;
    var dictionary = values.ToDictionary(x => "Arg" + ++argNo);
}

public void Method_1(string arg1, string arg2)
{
    // ...
    Method_2(arg1, arg2);
}

キーは呼び出し元のメソッド パラメータ名を表します

これを行う一般的な方法は、匿名オブジェクトを使用することです。

public void Method_2(object values)
{
    var dictionary = values.GetType()
                           .GetProperties()
                           .ToDictionary(pi => pi.Name, pi => pi.GetValue(values));
}

public void Method_1(string arg1, string arg2)
{
    Method_2(new { arg1, arg2 });
}

編集: Method_2 も変更できない場合は、2 つのオプションのいずれかと同じロジックを持つ別のメソッドで辞書を作成します。

編集への回答: 実装が機能しない理由は、(匿名) オブジェクトではなくオブジェクトの配列ですべてのプロパティを取得しているためです。あなたは私のコードを完全にコピーしませんでした。params object[] valuesする必要がありますobject values

于 2013-06-26T00:24:00.943 に答える
2
using System.Linq;

...

// add as many elements as you want
var args = new object[] {arg1, arg2, arg3, arg4};

int i = 0;
var dict = args.ToDictionary(x => "Arg" + ++i, x => x);

Method_2(dict);

Method_2これは機能しますが、他に選択肢がない限り、なぜ辞書を渡したいのかわかりません。

于 2013-06-26T00:15:16.663 に答える
0

ディクショナリを構築するプライベート メソッドを作成します。シンプルなループや、マットが提案したようなより簡潔なものを使用できます。

public void Method_1(string arg1, string arg2)
{
    var dict = BuildDictionary(arg1, arg2);
    Method_2(dict);
}

private Dictionary<string, object> BuildDictionary(params object[] args)
{
    Dictionary<string, object> dict= new Dictionary<string, object>();
    for(int i = 0; i < args.Length; i++)
    {
        dict.Add("Arg" + i, args[i]);
    }
    return dict;
}

マットのバージョンでは:

private Dictionary<string, object> BuildDictionary(params object[] args)
{
    return args.ToDictionary(x => "Arg" + ++i, x => x);
}
于 2013-06-26T00:18:53.623 に答える