实现泛型接口
本文关键字:泛型接口 实现 | 更新日期: 2023-09-27 18:07:01
谁能帮我通过接口暴露下面的类方法?我希望能够通过接口使用下面的缓存类方法。基本上需要创建一个通用接口,定义通用缓存方法,它们的实现将在下面的类
中提供。public class CacheStore
{
private Dictionary<string, object> _cache;
private object _sync;
public CacheStore()
{
_cache = new Dictionary<string, object>();
_sync = new object();
}
public bool Exists<T>(string key) where T : class
{
Type type = typeof(T);
lock (_sync)
{
return _cache.ContainsKey(type.Name + key);
}
}
public bool Exists<T>() where T : class
{
Type type = typeof(T);
lock (_sync)
{
return _cache.ContainsKey(type.Name);
}
}
public T Get<T>(string key) where T : class
{
Type type = typeof(T);
lock (_sync)
{
if (_cache.ContainsKey(key + type.Name) == false)
throw new ApplicationException(String.Format("An object with key '{0}' does not exists", key));
lock (_sync)
{
return (T)_cache[key + type.Name];
}
}
}
public void Add<T>(string key, T value)
{
Type type = typeof(T);
if (value.GetType() != type)
throw new ApplicationException(String.Format("The type of value passed to
cache {0} does not match the cache type {1} for key {2}",
value.GetType().FullName, type.FullName, key));
lock (_sync)
{
if (_cache.ContainsKey(key + type.Name))
throw new ApplicationException(String.Format("An object with key '{0}'
already exists", key));
lock (_sync)
{
_cache.Add(key + type.Name, value);
}
}
}
}
您可以像下面这样轻松地提取接口。
interface ICache
{
bool Exists<T>(string key) where T : class;
bool Exists<T>() where T : class;
T Get<T>(string key) where T : class;
void Add<T>(string key, T value);
}
现在你可以让你的类通过执行class CacheStore : ICache
实现它。
旁白:与其使用键和类型名称的字符串连接,不如简单地将Dictionary
键类型设置为Tuple<Type, string>
:
private Dictionary<Tuple<Type, string>, object> _cache;
为了更清楚地说明,以下是如何通过以下更改重新实现第一个Exists
方法:
public bool Exists<T>(string key) where T : class
{
Type type = typeof(T);
lock (_sync)
{
return _cache.ContainsKey(Tuple.Create(type, key));
}
}
这样会更简洁一些,而且它的优点是允许您不必担心名称冲突。在当前的设置中,如果我添加一个Location
和一个GeoLocation
,键是"FriendGeo"
,键是"Friend"
,会怎么样?它们都连接起来形成同一个字符串"FriendGeoLocation"
。这似乎是人为的,但如果它最终发生,您将得到非常奇怪(和错误)的行为,这将很难调试。
Visual Studio中有一个工具可以自动完成此操作。右键单击类,选择重构,提取接口,全选,确定