设置违反开闭原则验证的属性值

Set properties values with violating open-close principle validation

我有一个 ServiceField class,其中包含 FieldIdValue 作为两个属性。

    public class ServiceField
    {
        public int FieldId { get; set; }
        public string Value { get; set; }         
    }

        /// <summary>
        /// This method is used to assign value to HajjPackageFields class
        /// </summary>
        /// <param name="hajPackageObj">HajjPackageFields whose value needs to be updated</param>

        private void UpdateDetailFieldsValue(HajjPackageFields hajPackageObj)
        {
            foreach (ServiceField field in GetPackageDetails(hajPackageObj.PackageId))
            {

                if (field.FieldId == (int)HajjServiceFieldsEnum.AccomodationView)
                {
                    hajPackageObj.AccomodationView = field.Value == "1";
                }
                else if (field.FieldId == (int)HajjServiceFieldsEnum.AirTicket)
                {
                    hajPackageObj.AirTicket = field.Value == "1";
                }
            }
        }

问题是,如果在 HajjPackageField class 中添加任何新的 属性,我必须修改我的 UpdateDetailFieldsValue 方法,这违反了开闭原则。还有其他正确的方法来完成这个任务吗?

如果我清楚地理解你,反思将有助于解决问题:

private void UpdateDetailFieldsValue(HajjPackageFields hajPackageObj)
{
    var pairs = new Dictionary<int, string>();            
    foreach (var enumVal in typeof(HajjServiceFieldsEnum).GetEnumValues())            
        pairs[(int)(HajjServiceFieldsEnum)enumVal] = typeof(HajjServiceFieldsEnum).GetEnumName(enumVal);            

    foreach (ServiceField field in GetPackageDetails(hajPackageObj.PackageId))      
        typeof(HajjPackageFields).GetProperty(pairs[field.FieldId])
            ?.SetValue(hajPackageObj, field.Value == "1");  
}