避免使用开关盒

Jim*_*mmy 1 c#

我有一个接受params列表的以下方法"Test":

Public void method Test(params double[] list]
{
 Vols vol= new Vols();
//Fill the object based on the input list and
//pass this vol to other private method for further processing
}
Run Code Online (Sandbox Code Playgroud)

在此方法中,我使用名为Vols的自定义业务对象定义如下:

public class Vols
{
    private double _vol09;
    private double _vol05;
    private double _vol01;

    public Vols()
    {
    }


    public double Vol09
    {
        get { return _vol09; }
        set { _vol09 = value; }
    }


    public double Vol01
    {
        get { return _vol01; }
        set { _vol01 = value; }
    }


    public double Vol05
    {
        get { return _vol05; }
        set { _vol05 = value; }
    }
} 
Run Code Online (Sandbox Code Playgroud)

方法"test"的用户可以传入以下值:test(0.1,0.9);

所以,根据传递的输入,我想只在业务对象"Vols"中设置相应的属性....即.在这种情况下,属性Vol01和Vol09将在方法"test"中设置.有没有办法做到这一点,以便我可以避免方法内的开关案例?

这可能是使用反射...但由于反射很昂贵,我还可以使用其他方法吗?另外,我是否应该使用switch-case语句或反射这里的良好编码实践?

谢谢.

Rob*_*Rob 6

如果使用对象初始化程序,它会更具可读性......

var test = new Test() { Vol01 = 0.1, Vol09 = ... }
Run Code Online (Sandbox Code Playgroud)

您的构造函数可以构造默认业务对象,您的属性setter可以调用Vols上的相应属性.

使用流畅的界面也是有意义的,当有复杂的,可变的构造函数设置时,它总是一个不错的选择......

var test = new Test().WithVol01(0.1).AndIntentRevealingName();
Run Code Online (Sandbox Code Playgroud)

或者,只需注入业务对象......

var test = new Test(new Vols(...setup how I want it tested...));
Run Code Online (Sandbox Code Playgroud)

在C#4.0中,您可以使用命名参数,所有酷孩子都在这样做......

var test = new Test(vol01: 0.1, ...);
Run Code Online (Sandbox Code Playgroud)

反思过度,我不会担心表现.如果我的测试用例清楚地显示出意图,我会担心.