如何避免用不同的方法重写相同的代码

本文关键字:重写 代码 方法 何避免 | 更新日期: 2023-09-27 18:19:58

旧问题
所以这就是我正在努力实现的。。。

我有一个现有的抽象类。。让我们把它命名为Class1.cs.it包含许多方法的定义。所以现在我已经包括需要在每个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);
        }

除了论点,我必须在所有方法中做完全相同的事情可以变化。因此dictionary对象可以有"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方法进行哪些更改呢?

如何避免用不同的方法重写相同的代码

在没有太多关于Method_2的性质以及字典中的Keys表示什么的信息的情况下,我将建议两个选项。

密钥始终表示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

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,除非你别无选择。

您应该使用一个循环,并为变量命名提供一个模式。在你的方法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;
}

创建一个将构造字典的私有方法。你可以使用一个简单的循环,或者像马特建议的那样更简洁的东西。

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