首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >IDictionary‘2不能从IDictionary分配吗?

IDictionary‘2不能从IDictionary分配吗?
EN

Stack Overflow用户
提问于 2013-01-17 13:54:16
回答 4查看 1.1K关注 0票数 1

我的ViewModel上有一个IDictionary<string, string>类型的属性。我正在查看该ViewModel上的属性列表,并使用反射来确定它是否是字典。

目前我有:

代码语言:javascript
运行
复制
if (typeof(IDictionary).IsAssignableFrom(propDescriptor.PropertyType))

但是,这总是错误的,因为propDescriptor.PropertyTypeIDictionary`2。我有什么办法让它起作用吗?还有,为什么不起作用?

我只是把我的财产改为IDictionary,而不是IDictionary。

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

EN

回答 4

Stack Overflow用户

发布于 2013-01-17 13:59:33

它不能工作的原因是泛型接口没有将非泛型IDictionary作为基本接口。

也许这就是你想要的

代码语言:javascript
运行
复制
var type = propDescriptor.PropertyType;
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IDictionary<,>))
{ // ...

编辑:上面的代码将只检查type是否声明为IDictionary<X, Y>,对于某些XY。如果您还想处理type表示实现IDictionary<X, Y>的类或结构(甚至是从IDictionary<X, Y>派生的接口)的情况,请尝试如下:

代码语言:javascript
运行
复制
Func<Type, bool> isGenericIDict =
  t => t.IsGenericType && t.GetGenericTypeDefinition() == typeof(IDictionary<,>);
var type = propDescriptor.PropertyType;
if (isGenericIDict(type) || type.GetInterfaces().Any(isGenericIDict))
{ // ..
票数 5
EN

Stack Overflow用户

发布于 2013-01-17 13:57:56

不是IDictionary`2。它是编译生成的泛型IDictionary<TKey,TValue>的类名,不能直接传递给IDictionary

票数 1
EN

Stack Overflow用户

发布于 2013-01-17 14:00:03

IDictionary`2不是从IDictionary派生出来的,从其定义中可以看出:

代码语言:javascript
运行
复制
public interface IDictionary<TKey, TValue> :
    ICollection<KeyValuePair<TKey, TValue>>,
    IEnumerable<KeyValuePair<TKey, TValue>>,
    IEnumerable

因此,泛型IDictionary<TKey, TValue>不适用于IDictionary

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14380623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档