1

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

目前我有:

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

但是,这总是错误的,因为propDescriptor.PropertyTypeis IDictionary`2。有什么想法可以让它发挥作用吗?另外,为什么这不起作用?


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

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

4

4 回答 4

5

它不起作用的原因是泛型IDictionary<,>接口没有非泛型IDictionary作为基本接口。

也许这就是你想要的:

var type = propDescriptor.PropertyType;
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IDictionary<,>))
{ // ...

编辑:上面的代码只会检查是否type声明IDictionary<X, Y>some Xand Y。如果您还想处理type表示实现的类或结构 IDictionary<X, Y>甚至是派生自 的接口IDictionary<X, Y>)的情况,请尝试以下操作:

Func<Type, bool> isGenericIDict =
  t => t.IsGenericType && t.GetGenericTypeDefinition() == typeof(IDictionary<,>);
var type = propDescriptor.PropertyType;
if (isGenericIDict(type) || type.GetInterfaces().Any(isGenericIDict))
{ // ..
于 2013-01-17T13:59:33.260 回答
1

不是IDictionary`2。它是编译器生成的泛型类名IDictionary<TKey,TValue>,不能直接转换为IDictionary.

于 2013-01-17T13:57:56.427 回答
1

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

public interface IDictionary<TKey, TValue> :
    ICollection<KeyValuePair<TKey, TValue>>,
    IEnumerable<KeyValuePair<TKey, TValue>>,
    IEnumerable

因此泛型IDictionary<TKey, TValue>不能转换为IDictionary.

于 2013-01-17T14:00:03.200 回答
0

IDictionaryIDictionary< T, K >不同。

利用:

if (typeof(IDictionary<string, string>).IsAssignableFrom(propDescriptor.PropertyType))
于 2013-01-17T13:59:21.343 回答