C#如何将可选参数作为集合传递?

问题描述 投票:-1回答:3

假设我有第三方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);

并且如果我犯了一个错误,例如userData10paramName10所需的类型不同,则会出现编辑器和编译器错误。

这可能吗?我不想对用户输入数据的所有排列进行方法调用。将有太多代码需要管理。

c# parameter-passing
3个回答
0
投票

您可以使用switch support for pattern matching使它更具可读性。

当然,只要该值具有函数委托的位置,就可以用Dictionary和循环替换任何开关。当然,在这种情况下,密钥可能还需要有一个委托。

那些会使代码更具可读性,但不能避免编写工作。

除此之外,仅将函数调用的分辨率移出编译时并移入运行时。我不是朋友的第一步。


0
投票

您可以有类似的东西

int param1 = default(int);
double param2 = default(double);
MyClass param3 = default(MyClass);
 ....
ReadUserData(out param1, out param2, out param3, ...)

然后呼叫MethodA

MethodA(param1, param2, param3, ...)

0
投票

给出

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);
© www.soinside.com 2019 - 2024. All rights reserved.