我有一个用于缓存的抽象类,实现如下(简化)
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 :(得分: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>;
}
这些只能在一个结构中起作用,并没有真正做任何有用的事情而且设计不好。