指定された値がジェネリックリストであるかどうかを確認するにはどうすればよいですか?


88
public bool IsList(object value)
    {
        Type type = value.GetType();
        // Check if type is a generic list of any type
    }

指定されたオブジェクトがリストであるかどうか、またはリストにキャストできるかどうかを確認するための最良の方法は何ですか?


たぶん、あなたはここで答えを見つけるstackoverflow.com/questions/755200/...
マクシムKondratyuk

回答:


92
using System.Collections;

if(value is IList && value.GetType().IsGenericType) {

}

4
これは機能しません-次の例外が発生します-値はIListですジェネリック型「System.Collections.Generic.IList <T>」を使用するには「1」型引数が必要です

15
System.Collectionsを使用して追加する必要があります。ソースファイルの上に。私が提案したIListインターフェイスは汎用バージョンではありません(したがって、2番目のチェック)
James Couvares 2009

1
あなたが正しい。これは魅力のように機能します。ウォッチウィンドウでこれをテストしていて、名前空間がないことをすべて忘れていました。私はこのソリューションの方が好きで、とてもシンプルです

3
これは機能しません。4.0ではIList <T>!= IList?とにかく、それが汎用でIEnumerableであるかどうかを確認してから、確認したいプロパティ「Count」の存在を確認する必要がありました。この弱点が、WCFがすべてのList <T>をT []に変換する理由の一部だと思います。

1
@Edza不正解。これは通常、以来機能し、List<T>ObservableCollection<T>実装しIListます。
HappyNomad 2016

121

拡張メソッドの使用を楽しんでいる皆さんのために:

public static bool IsGenericList(this object o)
{
    var oType = o.GetType();
    return (oType.IsGenericType && (oType.GetGenericTypeDefinition() == typeof(List<>)));
}

だから、私たちはすることができます:

if(o.IsGenericList())
{
 //...
}

3
.Net Coreの場合、これを少し変更する必要がありますreturn oType.GetTypeInfo().IsGenericType && oType.GetGenericTypeDefinition() == typeof(List<>);
Rob L

チャームのように機能します!あなたがオブジェクトではなくタイプしかない場合、これはあなたのために働きます!ありがとう!
gatsby 2018

IList<>代わりにチェックする方が安全でしょうか?
NL-X


6
public bool IsList(object value) {
    return value is IList 
        || IsGenericList(value);
}

public bool IsGenericList(object value) {
    var type = value.GetType();
    return type.IsGenericType
        && typeof(List<>) == type.GetGenericTypeDefinition();
}

5
if(value is IList && value.GetType().GetGenericArguments().Length > 0)
{

}

GetType()の呼び出しが必要だと思います(例:value.GetType()。GetGenericArguments()。Length> 0
ScottS 2009

4

ビクターロドリゲスの答えに基づいて、ジェネリックスの別の方法を考案することができます。実際、元のソリューションは2行に減らすことができます。

public static bool IsGenericList(this object Value)
{
    var t = Value.GetType();
    return t.IsGenericType && t.GetGenericTypeDefinition() == typeof(List<>);
}

public static bool IsGenericList<T>(this object Value)
{
    var t = Value.GetType();
    return t.IsGenericType && t.GetGenericTypeDefinition() == typeof(List<T>);
}

3

.NET Standardで機能し、インターフェイスに対して機能する実装は次のとおりです。

    public static bool ImplementsGenericInterface(this Type type, Type interfaceType)
    {
        return type
            .GetTypeInfo()
            .ImplementedInterfaces
            .Any(x => x.GetTypeInfo().IsGenericType && x.GetGenericTypeDefinition() == interfaceType);
    }

そして、ここにテスト(xunit)があります:

    [Fact]
    public void ImplementsGenericInterface_List_IsValidInterfaceTypes()
    {
        var list = new List<string>();
        Assert.True(list.GetType().ImplementsGenericInterface(typeof(IList<>)));
        Assert.True(list.GetType().ImplementsGenericInterface(typeof(IEnumerable<>)));
        Assert.True(list.GetType().ImplementsGenericInterface(typeof(IReadOnlyList<>)));
    }

    [Fact]
    public void ImplementsGenericInterface_List_IsNotInvalidInterfaceTypes()
    {
        var list = new List<string>();
        Assert.False(list.GetType().ImplementsGenericInterface(typeof(string)));
        Assert.False(list.GetType().ImplementsGenericInterface(typeof(IDictionary<,>)));
        Assert.False(list.GetType().ImplementsGenericInterface(typeof(IComparable<>)));
        Assert.False(list.GetType().ImplementsGenericInterface(typeof(DateTime)));
    }

1

私は次のコードを使用しています:

public bool IsList(Type type) => IsGeneric(type) && (
            (type.GetGenericTypeDefinition() == typeof(List<>))
            || (type.GetGenericTypeDefinition() == typeof(IList<>))
            );

0

おそらく最良の方法は、次のようなことをすることです。

IList list = value as IList;

if (list != null)
{
    // use list in here
}

これにより、最大限の柔軟性が得られ、IListインターフェイスを実装するさまざまなタイプを操作できるようになります。


3
これは、要求された一般的なリストであるかどうかをチェックしません。
ルーカス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.