我的ViewModel上有一个IDictionary<string, string>类型的属性。我正在查看该ViewModel上的属性列表,并使用反射来确定它是否是字典。
目前我有:
if (typeof(IDictionary).IsAssignableFrom(propDescriptor.PropertyType))但是,这总是错误的,因为propDescriptor.PropertyType是IDictionary`2。我有什么办法让它起作用吗?还有,为什么不起作用?
我只是把我的财产改为IDictionary,而不是IDictionary。
编辑:不知道我的泛型去了哪里,但是上面句子中的第二个IDictionary有字符串,string。
发布于 2013-01-17 13:59:33
它不能工作的原因是泛型接口没有将非泛型IDictionary作为基本接口。
也许这就是你想要的
var type = propDescriptor.PropertyType;
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IDictionary<,>))
{ // ...编辑:上面的代码将只检查type是否声明为IDictionary<X, Y>,对于某些X和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-17 13:57:56
不是IDictionary`2。它是编译生成的泛型IDictionary<TKey,TValue>的类名,不能直接传递给IDictionary。
发布于 2013-01-17 14:00:03
IDictionary`2不是从IDictionary派生出来的,从其定义中可以看出:
public interface IDictionary<TKey, TValue> :
ICollection<KeyValuePair<TKey, TValue>>,
IEnumerable<KeyValuePair<TKey, TValue>>,
IEnumerable因此,泛型IDictionary<TKey, TValue>不适用于IDictionary。
https://stackoverflow.com/questions/14380623
复制相似问题