提问者:小点点

从对象属性获取最大值和名称


考虑到我有一个对象,其属性列表如下

Class Indicators
{
    guid Id
    double? Indocator1;
    double? Indocator1;

    .
    .double? IndocatorP;
}

我想添加一个属性,直接告诉在所有指示器属性中具有最大值的指示器名称。

有什么提示或建议吗?


共1个答案

匿名用户

您需要使用反射来获取属性列表和值列表,例如,应用Linq方法:

public class Indicators
{
  public Guid Id { get; set; }
  public double? Indocator1 { get; set; }
  public double? Indocator2 { get; set; }
  public double? Indocator3 { get; set; }

  public double? GetMaxIndicatorValue()
  {
    var properties = GetType().GetProperties().Where(p => p.PropertyType == typeof(double?));
    var values = properties.Select(p => p.GetValue(this));
    return (double?)values.Max();
  }
}

测试

static private void Test()
{
  var indicators = new Indicators();
  indicators.Indocator1 = 10;
  indicators.Indocator2 = null;
  indicators.Indocator3 = 20;
  Console.WriteLine(indicators.GetMaxIndicatorValue().ToString());
}

输出量

20

此示例假定成员是读写的。

您可以将它用于的字段。

此外,您还可以将两者结合使用,并且可以使用绑定标志筛选所需的成员(例如,您需要非公共成员或静态成员)。

用于更清洁和更稳健设计的改进

您应该使用,或者如果指示器的数量是固定的,则使用数组:

public class Indicators
{
  public Guid Id { get; set; }
  public List<double?> Values { get; } = new List<double?>();
  //or
  public double?[] Values { get; } = new double?[IndicatorsCount];
}

因此,我们可以简单地写:

var max = indicators.Values.Max();

我们可以把它放在类本身中:

public class Indicators
{
  public Guid Id { get; set; }
  public double?[] Values { get; } = new double?[IndicatorsCount];
  public double? MaxValue => Values.Max();
}