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]));