1

旧问题
所以这就是我想要实现的目标......

我有一个现有的抽象类 ..let 将其命名为 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 的性质和字典中的键代表什么的信息,我将建议两个选项。

键始终代表 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 也无法更改,请使用与两个选项之一具有相同逻辑的单独方法构建字典。

编辑答案:您的实现不起作用的原因是因为您获得了对象数组而不是(匿名)对象的所有属性。你没有完全复制我的代码。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

创建一个将构造字典的私有方法。你可以使用一个简单的循环或更简洁的东西,比如 Matt 建议的。

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 回答
0

您应该使用循环并有一个模式来命名变量。在您的方法 2 中,您应该能够轻松找到这些参数。下面,我假设您有一个名为 args 的参数列表,并将它们全部添加到字典中。享受

public void Method_1(string arg1, string arg2)
{
   /*
   //some code implementation specific to Method_1
   */
   var dict = GetArguments(args);
   Method_2(dict);
}

private Dictionary<string, object> GetArguments(List<string> args)
{
    Dictionary<string, object> dict= new Dictionary<string, object>();
   var counter = 1;
   foreach(var argItem in args)
   {
        dict.Add("Arg"+counter++, argItem);
   }
   return dict;
}
于 2013-06-26T00:12:00.120 回答