检测它是否为字典,并且密钥可从特定类型分配

时间:2017-08-03 06:13:50

标签: c# dictionary reflection

我正在使用自定义JsonConverter,并覆盖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);
}

非常受this answer启发。问题是,如果字典的键是特定类型,我只想返回true。例如,如果键的类型为Bar,或者继承/实现Bar,我只想返回true。价值无关紧要。值可以是任何类型。

Dictionary<string, int> // false
Dictionary<Bar, string> // true
Dictionary<Foo, string> // false
Dictionary<Bar, Foo> // true
Dictionary<BarSubClass, Foo> // true

我如何从Type检测它是Dictionary并且密钥是否可以从特定类型分配?

到目前为止我尝试过:

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

不幸的是,这会返回false

1 个答案:

答案 0 :(得分:3)

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

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