IDictionary`2不能从IDictionary转发?

时间:2013-01-17 13:54:16

标签: c# dictionary

我的ViewModel上有IDictionary<string, string>类型的属性。我将浏览ViewModel上的属性列表,并使用反射来确定它是否是字典。

目前我有:

if (typeof(IDictionary).IsAssignableFrom(propDescriptor.PropertyType))

但是,这总是错误的,因为propDescriptor.PropertyTypeIDictionary`2。任何想法我怎么能让它工作?另外,为什么这不起作用?


我刚将我的属性更改为IDictionary而不是IDictionary。

编辑:不知道我的泛型去了哪里,但上面句子中的第二个IDictionary有字符串,字符串。

4 个答案:

答案 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)

IDictionaryIDictionary< T, K >不同。

使用:

if (typeof(IDictionary<string, string>).IsAssignableFrom(propDescriptor.PropertyType))