C# 确定类型是否为字典

C# 确定类型是否为字典,c#,generics,dictionary,C#,Generics,Dictionary,如何确定类型是否为字典 目前唯一对我有效的是我是否真的知道这些论点 例如: var dict = new Dictionary<string, object>(); var isDict = dict.GetType() == typeof(Dictionary<string, object>; // This Works var isDict = dict.GetType() == typeof(Dictionary<,>; // This does not

如何确定类型是否为
字典

目前唯一对我有效的是我是否真的知道这些论点

例如:

var dict = new Dictionary<string, object>();
var isDict = dict.GetType() == typeof(Dictionary<string, object>; // This Works
var isDict = dict.GetType() == typeof(Dictionary<,>; // This does not work
var dict=newdictionary();
var isDict=dict.GetType()==typeof(Dictionary;//这很有效
var isDict=dict.GetType()==typeof(Dictionary;//这不起作用

但是字典并不总是
,所以我如何在不知道参数和不必检查名称的情况下检查它是否是字典(由于我们还有包含单词
Dictionary

的其他类,因此可以使用
IsAssignableFrom
检查type是否实现了
IDictionary

Type t = dict.GetType();
bool isDict = t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Dictionary<,>);
var dict = new Dictionary<string, object>();

var isDict = typeof(IDictionary).IsAssignableFrom(dict.GetType());

Console.WriteLine(isDict); //prints true
var dict=newdictionary();
var isDict=typeof(IDictionary).IsAssignableFrom(dict.GetType());
Console.WriteLine(isDict);//打印为true

对于所有没有实现
IDictionary
接口的类型,此代码都将打印false。

有一种非常简单的方法可以做到这一点,您已经非常接近了

试试这个:

var dict = new Dictionary<string, object>();
var isDict = (dict.GetType().GetGenericTypeDefinition() == typeof(Dictionary<,>))
var dict=newdictionary();
var isDict=(dict.GetType().GetGenericTypeDefinition()==typeof(字典))
怎么样

Dictionary<string, object> d = new Dictionary<string, object>();
Dictionary<int, string> d2 = new Dictionary<int, string>();
List<string> d3 = new List<string>();

Console.WriteLine(d is System.Collections.IDictionary);
Console.WriteLine(d2 is System.Collections.IDictionary);
Console.WriteLine(d3 is System.Collections.IDictionary);
Dictionary d=newdictionary();
字典d2=新字典();
列表d3=新列表();
WriteLine(d是System.Collections.IDictionary);
Console.WriteLine(d2是System.Collections.IDictionary);
Console.WriteLine(d3是System.Collections.IDictionary);

由于所有泛型字典类型都继承自IDictionary接口,您可以只检查
Dictionary
对象是否实现了
IDictionary
,因此可能
typeof(IDictionary)
。会有原语吗?我不太熟悉C#,但不是每个类都是子系统。对象吗?GetGenericTypeDefinitions抛出类型为“System.InvalidOperationException”的异常。一定是因为我在测试一个非泛型类型。愚蠢的我!@TheunArbeider-只有当类型不是泛型时才会发生这种情况,你是否包括了
IsGenericType
条件?是的,忘记了IsGenericType:)为什么这个答案在复制时还没有结束?我想应该是这样。这非常有帮助,但缺少了我需要的最后一部分-将未知对象转换成
字典
。这可以通过使用
dynamic genericType=Convert.ChangeType(obj,t);
。这看起来很好,但不起作用:“使用泛型类型'System.Collections.generic.IDictionary'需要2个类型参数"@BorisZinchenko只是复制粘贴到一个测试中并运行它,没有错误。您声明的错误消息,看起来您在字典定义中缺少了一个类型。正如在
字典
vs
字典
中一样,您可以在这里看到您的代码和错误:由于编译器如果您希望使用不带类型的
System.Collections.Generic.IDictionary
。在我的示例中,我使用非泛型接口
System.Collections.IDictionary;
。另外,如果您查看泛型字典类的定义,它确实按照实现了非泛型IDictionary接口。非常感谢您的澄清选项。代码以显式命名空间解析正确编译。我编辑了您的答案,以便其他人不会像我一样感到困惑。不,您需要先检查该类型是否为泛型类型。否则,您可能会得到
invalidoOperationException:“此操作仅对泛型类型有效。”
Dictionary<string, object> d = new Dictionary<string, object>();
Dictionary<int, string> d2 = new Dictionary<int, string>();
List<string> d3 = new List<string>();

Console.WriteLine(d is System.Collections.IDictionary);
Console.WriteLine(d2 is System.Collections.IDictionary);
Console.WriteLine(d3 is System.Collections.IDictionary);