我有一个这样的课程:
class MyClass
{
public int Value1 {get; set;}
public int Value2 {get; set;}
public int Value3 {get; set;}
public int Value4 {get; set;}
...
public string AnotherValue {get; set;}
}
实际上,大约有10个属性,所有属性均具有值。我想做的是确定具有最高值的属性。我最初以为这将是一件微不足道的任务,但是到目前为止,我仅设法提出了两种方法来实现它,而这两种方法都不是很优雅。
我的第一种方法是简单地测试每个值:
int runningValue = myClass.Value1;
if (myClass.Value2 > runningValue)
runningValue = myClass.Value2;
// etc...
第二种方法是使用反射来执行相同的操作,但是循环使用所有属性-尽管这并不理想,因为有些属性(例如AnotherValue)需要排除。
我的问题是:还有另一种方法可以实现这一目标吗?
答案 0 :(得分:3)
我建议您使用集合或列表而不是对象来承载相同的数据类型。
但是对于您的问题,您可以尝试使用 reflection GetProperties
从对象中获取所有想要比较的数据。
x.PropertyType == typeof(int)
可以确保您想与int进行比较的问题的类型。
MyClass a = new MyClass()
{
Value1 = 10,
Value2 = 11,
Value3 = 12,
Value4 = 14
};
a.GetType()
.GetProperties()
.Where(x => x.PropertyType == typeof(int) )
.Select(x => Convert.ToInt32(x.GetValue(a)))
.Max(x=>x);
答案 1 :(得分:0)
集合肯定会使此任务容易得多。如果决定走这条路线,您仍然可以拥有Value1 / Value2 / etc ..等属性,但是您必须实现get / set访问器才能在集合中查找数据。如果您知道每个值位于哪个索引,它可能就很简单
private List<int> Values = new List<int>(3);
public int Value1 {
get => Values[0];
set => Values[0] = value;
}
public int Value2 {
get => Values[1];
set => Values[1] = value;
}
如果您真的想走反射路线,则可以创建一个属性来指定确定最大值时要包括的属性
[AttributeUsage(AttributeTargets.Property)]
public class IncludeInMaxAttribute : Attribute
{
}
public class MyClass {
[IncludeInMax]
public int Value1 {get;set;}
[IncludeInMax]
public int Value2 {get;set;}
public string AnotherValue {get;set;}
public int GetMax()
{
int maxValue = int.MinValue;
foreach (var prop in this.GetType().GetProperties())
{
if (prop.GetCustomAttribute<IncludeInMaxAttribute>() != null)
{
maxValue = (int) prop.GetValue(this);
}
}
return maxValue;
}
}