我正在使用自定义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
。
答案 0 :(得分:3)
您必须检查泛型类型和第一个类型参数(TKey
):
concreteType.GetInterfaces().Any(i => i.IsGenericType &&
(i.GetGenericTypeDefinition() == typeof(IDictionary<,>)) &&
typeof(Bar).IsAssignableFrom(i.GetGenericArguments()[0]));