实现泛型接口

本文关键字:泛型接口 实现 | 更新日期: 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中有一个工具可以自动完成此操作。右键单击类,选择重构,提取接口,全选,确定