我的ViewModel
上有IDictionary<string, string>
类型的属性。我将浏览ViewModel
上的属性列表,并使用反射来确定它是否是字典。
目前我有:
if (typeof(IDictionary).IsAssignableFrom(propDescriptor.PropertyType))
但是,这总是错误的,因为propDescriptor.PropertyType
是IDictionary`2
。任何想法我怎么能让它工作?另外,为什么这不起作用?
我刚将我的属性更改为IDictionary而不是IDictionary。
编辑:不知道我的泛型去了哪里,但上面句子中的第二个IDictionary有字符串,字符串。
答案 0 :(得分:5)
它不起作用的原因是通用IDictionary<,>
interface没有非通用IDictionary
作为基础接口。
也许这就是你想要的:
var type = propDescriptor.PropertyType;
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IDictionary<,>))
{ // ...
修改:上述代码仅检查某些type
和{{1} IDictionary<X, Y>
宣布为X
}}。如果您还想处理Y
表示实现 type
的类或结构(或者甚至是从IDictionary<X, Y>
派生的接口)的情况,请尝试以下操作:
IDictionary<X, Y>
答案 1 :(得分:1)
不是IDictionary`2
。它是通用IDictionary<TKey,TValue>
的编译器生成的类名,不能直接转换为IDictionary
。
答案 2 :(得分:1)
IDictionary`2
不是从IDictionary
派生出来的,如其定义所示:
public interface IDictionary<TKey, TValue> :
ICollection<KeyValuePair<TKey, TValue>>,
IEnumerable<KeyValuePair<TKey, TValue>>,
IEnumerable
因此,通用IDictionary<TKey, TValue>
无法投放到IDictionary
。
答案 3 :(得分:0)
IDictionary与IDictionary< T, K >不同。
使用:
if (typeof(IDictionary<string, string>).IsAssignableFrom(propDescriptor.PropertyType))