2016-07-01 29 views
4

我試圖在初始化屬性時定義get; set;的值。c#如何使用get;如果值沒有設置,返回一個值?

我有以下接口

public interface IReportColumn 
{ 
    string Title { get; set; } 

    string ColumnKey { get; } 

    AggregateFunctions AggregateFunction { get; set; } 

    string SqlAlias { get; } 

} 

我需要做的,如果AggregateFunction == AggregateFunctions.None || ColumnKey == null設置屬性SqlAlias到一個隨機字符串什麼。但是,因爲我在這裏生成一個隨機字符串,所以我不希望它隨時調用get方法。我希望能夠得到它,設置它並在整個請求中重複使用相同的值。

這是我如何實現我的接口根據我的病情上述

public class ReportColumnMsSqlServer : IReportColumn 
{ 

    public string Title { get; set; } 

    public string ColumnKey { get; set; } 

    public AggregateFunctions AggregateFunction { get; set; } 

    public string SqlAlias { 

     get { 

      return this.GetColumnName(); 

     } 
    } 


    private string GetColumnName() 
    { 
     string columName = this.ColumnKey; 

     if (columName == null || this.AggregateFunction != AggregateFunctions.None) 
     { 
      columName = Convert.ToBase64String(Guid.NewGuid().ToByteArray()); 
     } 

     return string.Format("{0}", new Regex("[^a-zA-Z0-9]").Replace(columName, string.Empty)); 
    } 

} 

我怎樣才能設置SqlAlias值只有一次,在整個請求保持相同的價值呢?

+0

創建本地字段。如果爲空,生成ID否則返回保存ID – Nkosi

+0

由於你的問題是關於*設置*屬性值,你爲什麼問* * *?使用私人setter並在構造函數中設置值 –

+0

改變另一個屬性的屬性getter對我來說似乎是錯誤的。 – juharr

回答

5

您可以引入一個新的私有字段來存儲信息,而只計算值在第一時間它的訪問:

private string _sqlAlias = null; 
public string SqlAlias { 

    get { 
     if (_sqlAlias == null) 
      _sqlAlias = this.GetColumnName(); 
     return _sqlAlias; 

    } 
} 

根據您的使用情況下,由於返回值是基於兩個ColumnKeyAggregateFunction,則可以實現這兩個屬性的setter以將_sqlAlias設置回null,因此,進一步調用SqlAlias將基於其他更新的屬性重新計算新值。

+0

我不能重複使用相同的變量,像這樣'公共字符串SqlAlias { 得到 { 如果(SqlAlias == NULL){ 回報 this.GetColumnName(); } return this.SqlAlias; } }'?我有兩種方法來設置變量,只有一種是隨機的 – Jaylen

+1

@Jaylen不,讀取自身getter中的'SqlAlias'會導致堆棧溢出異常。 –

+1

@Jaylen如果你這樣做,你會創建一個循環引用。 '{get {if(SqlAlias'(call calls again).... –

1

使用簡單的「延遲加載」模式。

private string _sqlAlias; 
public string SqlAlias { 
    get { 
     if (_sqlAlias == null) { 
      _sqlAlias = GetColumnName(); 
     } 

     return _sqlAlias; 
    } 
} 
相關問題