问题描述
我想避免重复代码。目前我迭代某些“选项”,然后根据选项计算一个值。代码如下所示:
if (option == "A")
result = (y[0].A - y[1].A) / (x[0].A - x[1].A);
if (option == "B")
result = (y[0].B - y[1].B) / (x[0].B - x[1].B);
if (option == "C")
result = (y[0].C - y[1].C) / (x[0].C - x[1].C);
它对 A、B 和 C 执行相同的操作 - 有没有办法使用字符串“选项”来选择 x 和 y 的所需属性 (A,B,C)?
x,y 是 Dictionary
解决方法
您可以使用 Func
,例如:
public double DoCalculation(Func<YourClassName,double> property,Foo y0,Foo y1,Foo x0,Foo x1)
{
// Now we can call the Func on the objects passed in:
return (property(y0) - property(y1)) / (property(x0) - property(x1));
}
现在这样称呼它:
result = DoCalculation(
f => f.A,//<--- this is how you specify the property to call
y[0],y[1],x[0],x[1]);
相比其他使用反射的方法,我会这样做的原因:
- 反射速度较慢(尽管您可能会在此代码中注意到)
- 此方法具有编译时类型安全性。如果您使用反射,则直到运行时您才会知道该方法在类中不存在。
你可以像下面这样使用反射:
public double GetResult(string option) {
var prop = x[0].GetType().GetProperty(option);
var y0 = (double)prop.GetValue(y[0]);
var y1 = (double)prop.GetValue(y[1]);
var x0 = (double)prop.GetValue(x[0]);
var x1 = (double)prop.GetValue(x[1]);
var result = (y0-y1) / (x0-x1);
return result;
}
,
如果您确定 'option' 将始终与您可以使用的属性名称相同:
PropertyInfo info = typeof(<insert class y here>).GetProperty(option);
PropertyInfo info2 = typeof(<insert class x here>).GetProperty(option);
result = (double)info.GetValue(y[0]) - (double)info.GetValue(y[1]) / (double)info2.GetValue(x[0]) - (double)info2.GetValue(x[1])
此代码未经测试,但应该可以使用