2014-10-20 49 views
3

我有一个linq查询,我将返回一个Dictionary<int, string>。我有一个重载的缓存方法,我已经创建了这个方法,它会将Dictionary<T,T>项目作为参数之一。我在这门课有其他一些方法,其中List<T>T[]没有问题。但是这一个方法,拒绝用线程主题的错误信息进行编译。无法从使用情况推断方法的类型参数。尝试明确指定类型参数

这是我的缓存类代码:

public static bool AddItemToCache<T>(string key, Dictionary<T, T> cacheItem, DateTime dt) 
{ 
    if (!IsCached(key)) 
    { 
     System.Web.HttpRuntime.Cache.Insert(key, cacheItem, null, dt, TimeSpan.Zero); 

     return IsCached(key); 
    } 

    return true; 
} 

public static bool AddItemToCache<T>(string key, Dictionary<T, T> cacheItem, TimeSpan ts) 
{ 
    if (!IsCached(key)) 
    { 
     System.Web.HttpRuntime.Cache.Insert(key, cacheItem, null, Cache.NoAbsoluteExpiration, ts); 

     return IsCached(key); 
    } 

    return true; 
} 

,这是无法编译LINQ查询:

private Dictionary<int, string> GetCriteriaOptions() 
{ 
    Dictionary<int, string> criteria = new Dictionary<int, string>(); 
    string cacheItem = "NF_OutcomeCriteria"; 

    if (DataCaching.IsCached(cacheItem)) 
    { 
     criteria = (Dictionary<int, string>)DataCaching.GetItemFromCache(cacheItem); 
    } 
    else 
    { 
     Common config = new Common(); 
     int cacheDays = int.Parse(config.GetItemFromConfig("CacheDays")); 

     using (var db = new NemoForceEntities()) 
     { 
      criteria = (from c in db.OutcomeCriterias 
         where c.Visible 
         orderby c.SortOrder ascending 
         select new 
         { 
          c.OutcomeCriteriaID, 
          c.OutcomeCriteriaName 
         }).ToDictionary(c => c.OutcomeCriteriaID, c => c.OutcomeCriteriaName); 

      if ((criteria != null) && (criteria.Any())) 
      { 
       bool isCached = DataCaching.AddItemToCache(cacheItem, criteria, DateTime.Now.AddDays(cacheDays)); 

       if (!isCached) 
       { 
        ApplicationErrorHandler.LogException(new ApplicationException("Unable to cache outcome criteria"), 
         "GetCriteriaOptions()", null, ErrorLevel.NonCritical); 
       } 
      } 
     } 
    } 

    return criteria; 
} 

这行=的isCached ..... DataCaching我得到的错误。我试过把它转换成字典(Dictionary<int, string>),做一个.ToDictionary(),但没有任何效果。

任何人有任何想法?

+2

“OutcomeCriteriaID”和“OutcomeCriteriaName”的类型是什么?他们需要是相同的呼叫是有效的。 – Lee 2014-10-20 18:31:24

回答

5

由于字典的键和值类型需要相同,而您的不同,因此无法编译。你可以改变方法的定义,要求一个字符串键类型:

public static bool AddItemToCache<T>(string key, Dictionary<string, T> cacheItem, TimeSpan ts) 
{ 
    if (!IsCached(key)) 
    { 
     System.Web.HttpRuntime.Cache.Insert(key, cacheItem, null, Cache.NoAbsoluteExpiration, ts); 

     return IsCached(key); 
    } 

    return true; 
} 
+1

难道他也不能改变模板采取''? – Hogan 2014-10-20 18:37:40

+0

@Hogan - 是的,但'key'参数是一个字符串,'System.Web.HttpRuntime.Cache.Insert'使用字符串键,所以键类型是固定的。 – Lee 2014-10-20 18:42:18

4

改变你的方法签名的参数从

Dictionary<T, T> cacheItem 

Dictionary<TKey, TValue> cacheItem 

T,T意味着键和值具有相同的类型。

相关问题