6

オブジェクトをテストして実装するかどうかを確認したいのですが、何がIDictionary<TKey,TValue>何であるかは気にしませTKeyTValue

Dictionary<,>次のようなフレームワークの具体的なインスタンスであるかどうかをテストできます。

bool isDict = type.IsGenericType && 
    (typeof(Dictionary<,>).IsAssignableFrom(type.GetGenericTypeDefinition());

しかし、実装するものをテストする方法が思いつきませんIDictionary<,>。この手法は、インターフェイスでは機能しません。IsAssignableFrom一般的な基本型に対してテストすると false が返されますIDictionary<,>が、具体的な型に対して機能するため、奇妙に思えます。

通常is、何かがインターフェイスを実装しているかどうかをテストするために使用しますが、もちろん、これは特定の汎用インターフェイスをテストする場合にのみ機能します。または、共通の祖先インターフェイスをテストするだけですが、IList<>やなどの他のジェネリック データ構造とは異なり、ジェネリックが継承するICollection<>固有の非ジェネリック インターフェイスはありません。IDictionary<TKey,TValue>

4

1 に答える 1

10

のようなものはどうですか

return type.GetInterfaces()
           .Where(t => t.IsGenericType)
           .Select(t => t.GetGenericTypeDefinition())
           .Any(t => t.Equals(typeof(IDictionary<,>)));

これは、ジェネリック型の定義を簡単に一般化できると確信しています。

于 2012-06-05T15:19:23.753 に答える