在类内部实现验证规则

本文关键字:验证 规则 实现 内部 | 更新日期: 2023-09-27 18:27:19

我有像这个一样的class

public class EmployeeInfo
{
    public string EmployeeName { get; set; }
    public string PhoneNumber { get; set; }
    public string Office { get; set; }
    public string Department { get; set; }
}

我创建了一个以SPListItemCollection为参数并返回EmployeeInfo类的对象列表的方法。SPList内部没有限制,当您创建新项时,您可以将一些字段留空,所以我使用reflection来确定字段是否为null,然后在填充EmployeeInfo对象时插入空字符串以避免异常。

 public List<Models.EmployeeInfo> GetEmployeeInfo(SPListItemCollection splic)
 {
        var listEmployeeInfo = new List<Models.EmployeeInfo>();
        var propertyNames = new List<string>() { "EmployeeName", 
                                                 "Department", 
                                                 "Office", 
                                                 "PhoneNumber"};
        foreach (SPListItem item in splic)
        {
            var employeeInfo = new Models.EmployeeInfo();

            foreach (var propertyName in propertyNames)
            {
                string newData = "";
                if (item[propertyName] != null)
                {
                    newData = item[propertyName].ToString();
                }
                employeeInfo.GetType().GetProperty(propertyName).SetValue(employeeInfo, newData, null);

            }
            listEmployeeInfo.Add(employeeInfo);
        }
        return listEmployeeInfo;
    }

后来我了解到在嵌套循环中使用reflection是不好的做法,所以我正在寻找不同的方法。我有没有可能在EmpployeeInfo类中制定一些预验证规则,比如Validation方法,或者在类属性中编写一些代码,而不是在GetEmployeeInfo方法中编写一些,只是通过调用该方法来填充属性?非常感谢。

在类内部实现验证规则

只写c'tor:

public EmployeeInfo(string employeeName ,string phoneNumber, string office, string department)
{
    EmployeeName  = employeeName;
    PhoneNumber = phoneNumber;
    Office = office;
    Department = department;
}  

你可以这样称呼它:

var employeeInfo = new Models.EmployeeInfo(item["EmployeeName"] ?? "", item["PhoneNumber"] ?? "", item["Office"] ?? "", item["Department"] ?? "");  

无论如何,您应该避免将字段声明为公共字段,因为这会破坏封装。

您可以在单独的getter和setter 中添加逻辑

    public class EmployeeInfo
    {
        private string employeeName;
        public string EmployeeName 
        {
           get
           {
                return employeeName ?? ""; //Returns the content, or an empty string if it is null
           } 
           set
           {
                 employeeName = value;
           }
       }

    }

通过这种方式,在访问属性时可以获得一个标准值(比如""),而不是null。