在类

时间:2015-12-17 13:19:26

标签: c# reflection validationrules

我有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类中制作一些预验证规则,比如验证方法或在类属性内部编写一些代码,而不是在GetEmployeeInfo方法内部通过调用该方法来填充属性? 谢谢。

2 个答案:

答案 0 :(得分:1)

只写c&#tor; 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"] ?? "");  

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

答案 1 :(得分:0)

你可以在单独的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。