在继承自List <t> </t>的Class中更新它

时间:2015-04-07 19:55:32

标签: c# generics

我有一个用于缓存的抽象类,实现如下(简化)

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()来管理对象吗?

如果我这样做,我会看到对该对象的第一次调用将返回空,因为该对象可以在构造函数完成它的调用之前返回。

2 个答案:

答案 0 :(得分:3)

要回答这个问题,您无法在构造函数或任何其他方法中指定this。您可以添加从GetData()返回的项目:

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

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

继承形式List<T>可能不是正确的设计。

答案 1 :(得分:0)

根据Using this() in C# Constructors

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

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

这些只能在一个结构中起作用,并没有真正做任何有用的事情而且设计不好。