我有一个接受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语句或反射这些良好的编码实践?
感谢。
答案 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 );
}
}