2012-05-30 67 views
0

通用字典如下:如何检查特定字典是否是c#中的通用字典类型?

public class ConcurrentDictionary<TKey, TValue> : IDictionary<TKey, TValue> 

而具体的词典可以如下:

var container = new ConcurrentDictionary<string, Unit>(); 
var container = new ConcurrentDictionary<string, CustomUnitClass>(); 

所以,我怎么能检查是否存在字典是通用字典类型的?

object obj = GetObj(); // obj is some of many dictionaries 
if(obj is ?) 

在此先感谢您。

+0

如何获得泛型类的实例?这似乎没有多大意义。 –

回答

0
public class ConcurrentDictionary<TKey, TValue> : IDictionary<TKey, TValue> 

是一个“开放式泛型类型”,你可以不有开放泛型类型的实例。

但是,如果你想知道给定对象是否是具有泛型类型参数的字典,你可以使用反射来确定:

 var d1 = new Dictionary<int, string>(); 

     var t = d1.GetType(); 

     Console.WriteLine ("Generic? " + t.IsGenericType); 
3

你不应该,但如果你真的需要它出于某种原因,它是:

if (obj.GetType().GetGenericTypeDefinition() == typeof(Dictionary<,>)) { 
    // It is a Dictionary<TKey, TValue> 
} 

if (obj is ConcurrentDictionary<string, CustomUnitClass>) { 
    // It is a ConcurrentDictionary<string, CustomUsnitClass> 
} 
+0

第一个解决方案正常工作。第二个不是因为我有许多具有不同第二参数的ConcurrentDictionary对象。 – tesicg

+0

还有一个问题涉及到最初的问题 - 我该如何施展它?就像:(obj ConcurrentDictionary ).Keys [i] ...? – tesicg

+0

您应该为此使用非通用的IDictionary接口。但我强烈建议你重新考虑你的设计。 – erikkallen

0

你也可以把字典作为非通用IDictionary。当然,在这种情况下,你会失去所有强大的输入:

var dictionary = obj as IDictionary; 
if (dictionary != null) 
{ 
    ICollection keys = dictionary.Keys;  
    ICollection values = dictionary.Values; 
    // work with keys and values as a collection of objects 
} 
相关问题