實現

2015-12-17 80 views
0

的內部驗證規則,我有class這樣實現

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

我創建方法,它SPListItemCollectionEmployeeInfo class.There對象的參數,返回列表裏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方法中,通過調用該方法來填充屬性? 謝謝。

+0

通過驗證規則,你的意思是屬性值必須限制在某些值?你當然可以通過在'get {}中寫入某些東西並設置{}來做到這一點 – Ian

回答

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


    } 

這樣,你得到一個標準值(比方說""),而不是空的。

1

只寫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"] ?? ""); 

無論如何,你應該避免聲明領域公開,因爲它打破封裝。