オブジェクトが一般的なリストかどうかを判断する方法はありますか? リストのタイプはわかりませんが、それがリストであることはわかっています。どうすればそれを判断できますか?
6 に答える
これは「True」を返します
List<int> myList = new List<int>();
Console.Write(myList.GetType().IsGenericType && myList is IEnumerable);
それが正確に「リスト」であるかどうかを知りたいですか...それともIEnumerableでGenericでよろしいですか?
次のメソッドは、ジェネリック コレクション型のアイテム型を返します。型が ICollection<> を実装していない場合は、null が返されます。
static Type GetGenericCollectionItemType(Type type)
{
if (type.IsGenericType)
{
var args = type.GetGenericArguments();
if (args.Length == 1 &&
typeof(ICollection<>).MakeGenericType(args).IsAssignableFrom(type))
{
return args[0];
}
}
return null;
}
編集:上記の解決策は、指定された型に独自の汎用パラメーターがあることを前提としています。これは、ハード コーディングされた汎用パラメーターを使用して ICollection<> を実装する型では機能しません。次に例を示します。
class PersonCollection : List<Person> {}
このケースを処理する新しい実装を次に示します。
static Type GetGenericCollectionItemType(Type type)
{
return type.GetInterfaces()
.Where(face => face.IsGenericType &&
face.GetGenericTypeDefinition() == typeof(ICollection<>))
.Select(face => face.GetGenericArguments()[0])
.FirstOrDefault();
}
受け入れられた回答は、IList<> の型を保証しません。このバージョンをチェックしてください、それは私のために働きます:
private static bool IsList(object value)
{
var type = value.GetType();
var targetType = typeof (IList<>);
return type.GetInterfaces().Any(i => i.IsGenericType
&& i.GetGenericTypeDefinition() == targetType);
}
試す:
if(yourList.GetType().IsGenericType)
{
var genericTypeParams = yourList.GetType().GetGenericArguments;
//do something interesting with the types..
}
質問があいまいです。
答えは、一般的なリストの意味によって異なります。
List<SomeType> ?
List<SomeType> から派生したクラス?
IList<SomeType> を実装するクラス (この場合、配列は一般的なリストと見なすことができます。たとえば、int[] は IList<int> を実装します)?
ジェネリックで IEnumerable を実装するクラス (これは、受け入れられた回答で提案されたテストです)? しかし、これはまた、次のかなり病理学的なクラスを一般的なリストと見なします:
.
public class MyClass<T> : IEnumerable
{
IEnumerator IEnumerable.GetEnumerator()
{
return null;
}
}
最善の解決策 (GetType、IsAssignableFrom などを使用するかどうかなど) は、何を意味するかによって異なります。
System.Object クラスに GetType() 関数があります。あなたはそれを試しましたか?