如何避免用不同的方法重写相同的代码
本文关键字:重写 代码 方法 何避免 | 更新日期: 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);
}