如何检查一个以上对象的属性是否有价值

时间:2019-02-19 09:10:35

标签: c# design-patterns

我有一个具有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方法?

2 个答案:

答案 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; }

    }
}