2015-04-07 61 views
0

我有用於緩存一個抽象類,實現如下(簡化的)在從列表繼承類更新此<T>

public abstract class DataCacheMember<T> : List<T> 
{ 
    private List<T> _data; 
    public List<T> Data 
    { 
     get 
     { 
      if (_data == null || _data.Count() < 1) 
       _data = GetData(); 

      return _data; 
     } 
    } 

    private string ApiEndPoint {get; set;} 
    private Timer timer; 

    private List<T> GetData() 
    { 
     //call api and get data 
    } 

    private void RefreshData() 
    { 
     _data = GetData(); 
    } 

    protected DataCacheMember(string apiEndPoint) 
    { 
     ApiEndPoint = apiEndPoint; 

     timer = new System.Threading.Timer(
      e => RefreshData(), 
      null, 
      TimeSpan.Zero, 
      TimeSpan.FromMinutes(10)); 
    } 
} 

它允許快速創建緩存對象的用一個簡單的字符串的API端點:

public class StateMap<Properties> : DataCacheMember<Properties> 
{ 
    public StateMap(string apiEndPoint = "Property/GetProperties") 
     : base(apiEndPoint) 
    {} 
} 

的全部原因從List<T>繼承了以刪除領域的需要。

但是,如果我嘗試修改構造函數和刷新:

private void RefreshData() 
{ 
    this = GetData() as DataCacheMember<T>; 
} 

protected DataCacheMember(string apiEndPoint) 
{ 
    this = GetData() as DataCacheMember<T>; 
} 

我得到的Cannot assign to <this> because it is Read Only錯誤。

解決此問題的正確方法是什麼?我只需要使用Clear()AddRange()來管理對象?

如果我這樣做,我看到第一次調用該對象將返回空,因爲該對象可以在構造函數完成它的調用之前返回。

+0

列表的責任是填充自己嗎? – CodeCaster

+0

你不應該繼承'List '。 – SLaks

+3

「從列表繼承的全部原因是爲了消除字段的需要。」但你有一個存儲列表的字段 - 如果你的結構不是一個列表,而是_contains_列表,然後以這種方式進行建模 - 繼承似乎並不是這裏的正確設計。 –

回答

3

要回答這個問題,您不能在構造函數或其他方法中指定this。你可以添加從GetData()返回的項目:

private void RefreshData() 
{ 
    this.Clear(); 
    this.AddRange(GetData()); 
} 

protected DataCacheMember(string apiEndPoint) 
{ 
    this.Clear(); 
    this.AddRange(GetData()); 
} 

繼承形式List<T>可能是不正確的設計在這裏。

+0

標記這個正確的,因爲它在技術上有效,但從'List '繼承是一個壞主意。我無法以覆蓋父訪問器的方式添加空/空檢查,因此在允許用戶請求列表之前無法確保調用GetData()。 – Wesley

0

根據Using this() in C# Constructors

private void RefreshData() 
{ 
    this = GetData() as DataCacheMember<T>; 
} 

protected DataCacheMember(string apiEndPoint) 
{ 
    this = GetData() as DataCacheMember<T>; 
} 

這些只會在結構中工作,並沒有真正做什麼有用的,是糟糕的設計。