假设我有第三方MethodA(type1 paramName1 = null, type2 paramName2 = null,...., nonNullAbleSuchAsInt paramName10 = 123)
。
而且我想通过使用用户提供的数据调用相同的MethodA来执行以下操作。用户可以为我提供paramName2和paramName4的数据,或其他一些排列方式,例如[paramName2,paramName3,paramName5,paramName7]等。
if(user gives me data for paramName2 and nothing else)
{
MethodA(paramName2=userData2)
}
else if(user give me data for paramName2, paramName3, and nothing else)
{
MethodA(paramName2=userData2, paramName3=userData3)
}
else if(user give me data for paramName2, paramName4, and nothing else)
{
MethodA(paramName2=userData2, paramName4=userData4)
}
else if(user give me data for paramName2, paramName3, paramName4, and nothing else)
{
MethodA(paramName2=userData2, paramName3=userData3, paramName4=userData4)
}
... repeat for all permutations.
但是,那么多重复的代码。
我要执行以下操作。我该怎么办?
MagicStorage<MethodA_Declaration> magicArgs = new MagicStorage<MethodA_Declaration>();
if(user gives me data for paramName1)
{
magicArgs.Add(paramName1, userData1);
}
if(user gives me data for paramName2)
{
magicArgs.Add(paramName2, userData2);
}
... repeat
if(user gives me data for paramName10)
{
magicArgs.Add(paramName10, userData10);
}
MethodA(magicArgs);
并且如果我犯了一个错误,例如userData10
与paramName10
所需的类型不同,则会出现编辑器和编译器错误。
这可能吗?我不想对用户输入数据的所有排列进行方法调用。将有太多代码需要管理。
您可以使用switch support for pattern matching使它更具可读性。
当然,只要该值具有函数委托的位置,就可以用Dictionary和循环替换任何开关。当然,在这种情况下,密钥可能还需要有一个委托。
那些会使代码更具可读性,但不能避免编写工作。
除此之外,仅将函数调用的分辨率移出编译时并移入运行时。我不是朋友的第一步。
您可以有类似的东西
int param1 = default(int);
double param2 = default(double);
MyClass param3 = default(MyClass);
....
ReadUserData(out param1, out param2, out param3, ...)
然后呼叫MethodA
:
MethodA(param1, param2, param3, ...)
给出
MethodA(type1 paramName1 = null, type2 paramName2 = null, int paramName10 = 132).
用法
public class data
{
public type1 ParamName1 {get;set;}
public type2 paramName2 {get;set;}
// initalize with what ever default the method takes as optional
public int paramName10 {get;set;} = 123;
}
...
// pass in all paramaters, dont both about ifs
// we can do this, because you have already figured out the defaults
// from the signature
MethodA(data.ParamName1, data.paramName2, data.paramName10);