2011-11-22 78 views
1

我在如下編碼真實我的模型類中的字段:我怎樣才能讓我的領域只設置一次?

public string CreatedBy 
    { 
     get { return _CreatedBy; } 
     set { _CreatedBy = value; Created = DateTime.Now; } 
    } 
    public DateTime? Created { get; set; } 

當CreatedBy字段被填充那麼它會自動填寫創建日期。我的問題是,如果我再次設置CreatedBy字段(是的,它可能會發生),那麼日期會再次更新當前日期。

有沒有一種方法可以使CreatedBy和Created字段只填充一次?

+0

曾經由誰填充過?這是堅持在數據庫? –

回答

1

使用支持字段,並檢查該值是否已經設置 - 如果是這樣,離開它不變:

private DateTime? created; 
public DateTime? Created 
{ 
    get { return created; } 
    set { if (created == null) created = value; } 
} 
1

。利用構造和iniailize到defult值的屬性你想

public classConstructor() 
{ 
    propertyName = defaultValue; 
} 
2

你能不能查,該組中,是否已經有一個值,根本就沒有設置新的價值?

+0

+1。您將邏輯編程到set方法中。 – TomTom

1

下面是一個簡單的方法:用?運營商。如果Created爲null,則它將轉到DateTime.Now。

public string CreatedBy 
{ 
    get { return _CreatedBy; } 
    set { _CreatedBy = value; Created = Created ?? DateTime.Now; } 
} 
public DateTime? Created { get; set; } 
+0

+1回答這個問題,而不告訴OP在構造函數中設置值(這可能是也可能不是一個好建議) –

+0

@KirkBroadhurst好吧,在構造函數中設置它肯定會成爲答案。這將是*期望的用例(設置一次,忘記它),而不是讓一些屬性的集合具有設置另一個屬性的副作用,儘管這通常是不好的設計,但可能是這裏所期望的效果。 – MPelletier

+0

但是你不能在構造函數中設置每個屬性!任何名爲'Created ...'的屬性都會在構造函數中設置* sound *,但我從不假設這些東西。 –

1

在這種情況下,最好在構造函數中包含CreatedBy。這將意味着「創建時間」的語義:

public string CreatedBy 
{ 
    get; 
    private set; 
} 

public DateTime? Created 
{ 
    get; 
    private set; 
} 

public Model(..., string createdBy) 
{ 
    this.CreatedBy = createdBy; 
    this.Created = DateTime.Now; 
} 

// another option, if you don't like the ctor route 
public void AssignCreator(string createdBy) 
{ 
    if (this.Created.HasValue) throw new InvalidOperationException(); 
    this.CreatedBy = createdBy; 
    this.Created = DateTime.Now; 
} 

你的另一個選項是在屬性setter拋出InvalidOperationException如果Created爲非空。