C# 检测它是否为';它是一个字典,并且可以从特定类型分配密钥

C# 检测它是否为';它是一个字典,并且可以从特定类型分配密钥,c#,dictionary,reflection,C#,Dictionary,Reflection,我正在处理一个自定义,并重写CanConvert-方法 public override bool CanConvert(Type objectType) { return (typeof(IDictionary).IsAssignableFrom(objectType) || TypeImplementsGenericInterface(objectType, typeof(IDictionary<,>))); } private static bo

我正在处理一个自定义,并重写
CanConvert
-方法

public override bool CanConvert(Type objectType)
{
    return (typeof(IDictionary).IsAssignableFrom(objectType) ||
            TypeImplementsGenericInterface(objectType, typeof(IDictionary<,>)));
}

private static bool TypeImplementsGenericInterface(Type concreteType, Type interfaceType)
{
    return concreteType.GetInterfaces()
           .Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == interfaceType);
}
如何从
类型
中检测它是否是
字典
,并且密钥是否可从特定类型分配

到目前为止,我所尝试的:

typeof(IDictionary<Bar, object>).IsAssignableFrom(objectType)
typeof(IDictionary).IsAssignableFrom(objectType)

不幸的是,这将返回
false

您必须检查泛型类型和第一个类型参数(
TKey
):

concreteType.GetInterfaces().Any(i=>i.IsGenericType&&
(i.GetGenericTypeDefinition()==typeof(IDictionary))&&
typeof(Bar).IsAssignableFrom(i.GetGenericArguments()[0]);

可能与@derape重复-区别在于我没有实例。我有一个类型。另外,我已经知道如何检查它是否可以从字典中赋值。我需要检查它是否也有一个特定的键。你需要深入研究界面定义@smoksnes你不需要一个实例来做这件事,只是类型很好。正是我想要的。
typeof(IDictionary<Bar, object>).IsAssignableFrom(objectType)
concreteType.GetInterfaces().Any(i => i.IsGenericType &&
    (i.GetGenericTypeDefinition() == typeof(IDictionary<,>)) &&
    typeof(Bar).IsAssignableFrom(i.GetGenericArguments()[0]));