1

ViewModelタイプのプロパティがありますIDictionary<string, string>。そのプロパティのリストViewModelを調べ、リフレクションを使用してそれが辞書であるかどうかを判断します。

現在私は持っています:

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

ただし、 is であるため、常に falsepropDescriptor.PropertyTypeですIDictionary`2。どうすればそれを機能させることができますか?また、なぜそれが機能しないのですか?


プロパティを IDictionary ではなく IDictionary に変更しました。

編集:ジェネリックがどこに行ったのかわかりませんが、上記の文の 2 番目の IDictionary には文字列、文字列があります。

4

4 に答える 4

5

機能しない理由は、ジェネリックIDictionary<,>インターフェイスに非ジェネリック インターフェイスがないためIDictionaryです。

多分これはあなたが望むものです:

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

編集:上記のコードは、が someおよびとして宣言されてtypeいるかどうかのみをチェックします。を実装するクラスまたは構造体(または から派生したインターフェース)を表すケースも処理したい場合は、次のようにしてください。IDictionary<X, Y>XYtype 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`2IDictionaryは、その定義に見られるように、次のものから派生したものではありません。

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

したがって、ジェネリックIDictionary<TKey, TValue>は にキャストできませんIDictionary

于 2013-01-17T14:00:03.200 に答える
1

そうではありませんIDictionary`2IDictionary<TKey,TValue>これは、に直接キャストできないジェネリックのコンパイラ生成クラス名ですIDictionary

于 2013-01-17T13:57:56.427 に答える
0

IDictionaryはIDictionary< T, K >とは異なります。

使用する:

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