根据给定的字符串选择属性名称

问题描述

我想避免重复代码。目前我迭代某些“选项”,然后根据选项计算一个值。代码如下所示:

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,这个类有属性 A,C 是双精度的

解决方法

您可以使用 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]);

相比其他使用反射的方法,我会这样做的原因:

  1. 反射速度较慢(尽管您可能会在此代码中注意到)
  2. 此方法具有编译时类型安全性。如果您使用反射,则直到运行时您才会知道该方法在类中不存在。
,

你可以像下面这样使用反射:

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])

此代码未经测试,但应该可以使用

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...