考虑到我有一个对象,其属性列表如下
Class Indicators
{
guid Id
double? Indocator1;
double? Indocator1;
.
.double? IndocatorP;
}
我想添加一个属性,直接告诉在所有指示器属性中具有最大值的指示器名称。
有什么提示或建议吗?
您需要使用反射来获取属性列表和值列表,例如,应用
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();
}