5

私が次のことを宣言するとしましょう

Dictionary<string, string> strings = new Dictionary<string, string>();
List<string> moreStrings = new List<string>();

public void DoSomething(object item)
{
   //here i need to know if item is IDictionary of any type or IList of any type.
}

私は使用してみました:

item is IDictionary<object, object>
item is IDictionary<dynamic, dynamic>

item.GetType().IsAssignableFrom(typeof(IDictionary<object, object>))
item.GetType().IsAssignableFrom(typeof(IDictionary<dynamic, dynamic>))

item is IList<object>
item is IList<dynamic>

item.GetType().IsAssignableFrom(typeof(IList<object>))
item.GetType().IsAssignableFrom(typeof(IList<dynamic>))

これらはすべてfalseを返します!

では、(このコンテキストで)アイテムがIDictionaryまたはIListを実装していることをどのように判断しますか?

4

4 に答える 4

8
    private void CheckType(object o)
    {
        if (o is IDictionary)
        {
            Debug.WriteLine("I implement IDictionary");
        }
        else if (o is IList)
        {
            Debug.WriteLine("I implement IList");
        }
    }
于 2012-11-02T16:38:31.950 に答える
4

非ジェネリックインターフェイスタイプを使用できます。または、コレクションがジェネリックであることを本当に知る必要がある場合は、typeof型引数なしで使用できます。

obj.GetType().GetGenericTypeDefinition() == typeof(IList<>)
obj.GetType().GetGenericTypeDefinition() == typeof(IDictionary<,>)

適切な対策として、非ジェネリック型のobj.GetType().IsGenericTypeを避けるようにチェックする必要があります。InvalidOperationException

于 2012-11-02T16:25:50.537 に答える
1

これがあなたが望むものかどうかはGetInterfacesわかりませんが、項目タイプで を使用して、返されたリストのいずれかがIDictionaryまたはIList

item.GetType().GetInterfaces().Any(x => x.Name == "IDictionary" || x.Name == "IList")

それでいいと思います。

于 2012-11-02T16:27:09.190 に答える