我有一个具有n个属性的类,我需要知道是否有多个属性具有值,这将是错误的,我编写了这样的方法 CheckValue
public class ClassExample
{
public ClassExample(string value1, string value2, string value3)
{
Value1 = value1;
Value2 = value2;
Value3 = value3;
if (CheckValue()) throw new Exception("Not allow set value for both Value1, Value2, Value3");
}
public string Value1 { get; }
public string Value2 { get; }
public string Value3 { get; }
public bool CheckValue()
{
if ((Value1 != null ? 1 : 0) +
(Value2 != null ? 1 : 0) +
(Value3 != null ? 1 : 0) > 1)
{
return true;
}
return false;
}
}
有没有更好的方法编写CheckValue方法?
答案 0 :(得分:1)
您可以执行以下操作。例如,假设您所关注的属性以模式Value_命名。您可以根据需要更改搜索过滤器。
public bool CheckValue()
{
return this.GetType().GetProperties()
.Where(property=> property.Name.StartsWith("Value"))
.Count(property=>property.GetValue(this,null)!=null)>=1;
}
如果您不想过滤属性,则可以执行以下操作。
return `this.GetType().GetProperties().Count(property=>property.GetValue(this,null)!=null)>=1;
您可能还必须标识值类型的期望值/默认值,并对它们进行检查,因为上面的查询仅检查空值。 但是请注意使用反射的性能含义。
答案 1 :(得分:0)
假定所有属性都是相同的类型,或者所有属性都可以为空。您可以使用params
:
public class ClassExample
{
public ClassExample(params string[] values)
{
if (values == null || values.Count(p => p != null) != 1) throw new ArgumentException("Just 1 value please");
if (values.Length > 0) Value1 = values[0];
if (values.Length > 1) Value2 = values[1];
// rest of property assignments;
}
public string Value1 { get; private set; }
public string Value2 { get; private set; }
public string Value3 { get; private set; }
}
}