2011-02-09 40 views
3

我們建議我得到了一個接口,並從它繼承類,驗證性能

internal interface IPersonInfo 
{ 
    String FirstName { get; set; } 
    String LastName { get; set; } 
} 
internal interface IRecruitmentInfo 
{ 
    DateTime RecruitmentDate { get; set; } 
} 

public abstract class Collaborator : IPersonInfo, IRecruitmentInfo 
{ 
    public DateTime RecruitmentDate 
    { 
     get; 
     set; 
    } 
    public String FirstName 
    { 
     get; 
     set; 
    } 
    public String LastName 
    { 
     get; 
     set; 
    } 
    public abstract Decimal Salary 
    { 
     get; 
    } 
} 

那麼如何驗證的合作者類的字符串?是否有可能實現內部屬性?

回答

4

是的,但不使用自動屬性。您將需要手動實現具有後臺字段的屬性:

private string firstName; 

public String FirstName 
{ 
    get 
    { 
     return firstName; 
    } 
    set 
    { 
     // validate the input 
     if (string.IsNullOrEmpty(value)) 
     { 
      // throw exception, or do whatever 
     } 
     firstName = value; 
    } 
} 
+0

毆打23秒:) – GWLlosa 2011-02-09 14:36:39

0

是的。您可以創建一個私人支持字段的屬性,像這樣:

private String _firstName; 

public String FirstName 
{ 
    get 
    { 
      return _firstName; 
    } 
    set 
    { 
      //Check value for correctness here: 
      _firstName = value; 
    } 
} 
0
private DateTime recruitmentDate;  
public DateTime RecruitmentDate 
{ 
    get { return recruitmentDate; } 
    set 
    { 
     validate(value); 
     recruitmentDate = value; 
    } 
} 
2

據我所知,如果使用自動屬性語法,你失去訪問支持字段的能力。根據文檔(http://msdn.microsoft.com/en-us/library/bb384054.aspx):

在C#3.0及更高版本,自動實現 特性使財產申報 更簡潔在屬性訪問器中不需要額外的邏輯 。 它們還使客戶端代碼能夠創建 對象。如下例所示,如果聲明屬性 , 編譯器會創建一個私有的匿名 後臺字段,該字段只能通過屬性的get 和set訪問器訪問 。

屬性被允許在 自動實現的屬性,但 顯然不是在背襯領域 因爲這些都不是從 你的源代碼訪問。如果您必須在 屬性的後臺字段上使用 屬性,只需創建一個常規的 屬性。

所以你唯一的解決方案是創建常規屬性。

0

如果您的意思是您可以在C#中獲取/設置屬性期間執行自定義邏輯,那麼答案是肯定的。

您使用的是默認支持存儲和邏輯的所謂自動屬性。

你只需要提供自己像

private int backingStoreVariable; 
public property MyProperty 
{ 
    get 
    { 
     return this.backingStoreVariable; 
    } 
    set 
    { 
     this.backingStoreVariable=value; 
    } 
} 

現在你可以在你的GET運行自定義驗證代碼,並設置塊。

3

事情是這樣的......

private string _firstName; 
public string FirstName 
{ 
    get 
    { 
     return _firstName; 
    } 
    set 
    { 
     if (value != "Bob") 
      throw new ArgumentException("Only Bobs are allowed here!"); 
     _firstName = value; 
    } 
} 

基本上,你使用什麼屬性是語法糖版本。在編譯時,他們創建一個私有成員變量並連接屬性以使用該變量,就像我在這裏手動執行的那樣。確切的原因是,如果你想添加邏輯,你可以把它轉換成像我這樣的手冊,而不會破壞接口的實現。

2

還應該提到的驗證框架,如果你變得有點更復雜。他們可以使驗證規則更容易管理,並且還會在您的用戶界面中顯示錯誤,同時將規則與您的模型綁定在一起,因此您不必擁有任何重複的樣板驗證代碼。根據您的框架版本,一個選項是DataAnnotations

0

或者,您無法爲字段使用值類型。例如,你可以創建一個「姓」類實現如下:

public class FirstName 
{ 
    private string _Value; 
    public string Value 
    { 
     get 
     { 
      return _Value; 
     } 
     set 
     { 
      if (string.IsNullOrEmpty(value)) 
       throw new ArgumentNullException("Value cannot be null"); 
      if (value.Length > 128) 
       throw new ArgumentOutOfRangeException("Value cannot be longer than 128 characters"); 
      _Value = value; 
     } 
    } 

    public FirstName(string initialValue) 
    { 
     Value = initialValue; //does validation check even in constructor 
    } 
} 

最後,您的代碼示例在上面,你只會有:

public interface IPersonInfo 
{ 
    FirstName FirstName { get; set; } 
    String LastName { get; set; } 
} 

等與其他的屬性。 然後使用您的CODEL的財產,你會:

public FirstName MyFirstName; 
var x = MyFirstName.Value; 

如果你有很多要驗證領域,這可能最終會被繁瑣的方法。但是,你可以概括它來處理某些類型的數字 - 比如正數(ints > 0),或計數(int >= 0),措施等

字符串是困難,因爲他們往往有除了值類型長度的限制(如因爲沒有特殊字符,沒有數字等等。這可以通過在繼承類的構造函數中設置只讀長度屬性來調節。