避免使用开关盒

时间:2010-08-23 17:58:25

标签: 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
}

在此方法中,我使用名为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; }
    }
} 

方法“test”的用户可以传递值为:test(0.1,0.9);

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

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

感谢。

4 个答案:

答案 0 :(得分:6)

如果您使用了对象初始化程序,那将更具可读性......

var test = new Test() { Vol01 = 0.1, Vol09 = ... }

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

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

var test = new Test().WithVol01(0.1).AndIntentRevealingName();

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

var test = new Test(new Vols(...setup how I want it tested...));

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

var test = new Test(vol01: 0.1, ...);

反思过度,我不会担心表现。如果我的测试用例清楚地表明了意图,我会担心。

答案 1 :(得分:0)

应该可以使用反射来解决

答案 2 :(得分:0)

你不能在C#中打开double类型的变量,如果可能的话我会避免反射。

您的代码无法明确您实际要存储在VolXX属性中的值。它们是double型,Vol09属性只会存储0.9的值吗?

答案 3 :(得分:0)

如果可能,我会重做Vols课程。这是一个想法...

public class Vols
{ 
    private List<double> _vols = new List<double>();

    public void AddVolume( double volume )
    {
        _vols.Add( volume );
    }

    public void GetVolume( int index )
    {
        return _vols.ElementAtOrDefault( index );
    }
}