54 votes

Déterminer si la collection est de type IEnumerable <T>

Comment déterminer si l'objet est de type IEnumerable <T>?

Code:

 namespace NS {
    class Program {
    	static IEnumerable<int> GetInts() {
    		yield return 1;
    	}
    	static void Main() {
    		var i = GetInts();
    		var type = i.GetType();
    		Console.WriteLine(type.ToString());
    	}
    }
}
 

Sortie:

 NS.1.Program+<GetInts>d__0
 

Si je modifie GetInts pour qu'il retourne IList, tout va bien, la sortie est:

  System.Collections.Generic.List`1[System.Int32]
 

Et cela retourne faux:

 namespace NS {
    class Program {
    	static IEnumerable<int> GetInts() {
    		yield return 1;
    	}
    	static void Main() {
    		var i = GetInts();
    		var type = i.GetType();
    		Console.WriteLine(type.Equals(typeof(IEnumerable<int>)));
    	}
    }
}
 

111voto

Marc Gravell Points 482669

Si vous voulez dire la collecte, puis juste as:

var asEnumerable = i as IEnumerable<int>;
if(asEnumerable != null) { ... }

Cependant, je suis en supposant (à partir de l'exemple) que vous avez un Type:

L' objet ne sera jamais "de type" IEnumerable<int> - mais il pourrait mettre en œuvre il; je m'attends à ce que:

if(typeof(IEnumerable<int>).IsAssignableFrom(type)) {...}

le ferait. Si vous ne connaissez pas l' T (int dans le ci-dessus), puis vérifier toutes les mises en œuvre des interfaces:

static Type GetEnumerableType(Type type) {
    foreach (Type intType in type.GetInterfaces()) {
        if (intType.IsGenericType
            && intType.GetGenericTypeDefinition() == typeof(IEnumerable<>)) {
            return intType.GetGenericArguments()[0];
        }
    }
    return null;
}

et composez le:

Type t = GetEnumerableType(type);

si c'est null, il n'est pas IEnumerable<T> pour toute T - sinon, vérifiez t.

14voto

Mark Rendle Points 4592

Même technique que la réponse de Marc, mais Linqier:

 namespace NS
{
    class Program
    {
        static IEnumerable<int> GetInts()
        {
            yield return 1;
        }

        static void Main()
        {
            var i = GetInts();
            var type = i.GetType();
            var isEnumerableOfT = type.GetInterfaces()
                .Any(ti => ti.IsGenericType
                     && ti.GetGenericTypeDefinition() == typeof(IEnumerable<>));
            Console.WriteLine(isEnumerableOfT);
        }
    }
}
 

7voto

Piotr Justyna Points 2140

Comment déterminer si l'objet est de type IEnumerable <T>?

N'hésitez pas à utiliser cette méthode d'extension générique, ultra petite et fine, pour déterminer si un objet implémente l'interface IEnumerable. Il étend le type d' objet afin que vous puissiez l'exécuter en utilisant n'importe quelle instance de n'importe quel objet que vous utilisez.

 public static class CollectionTestClass
{
    public static Boolean IsEnumerable<T>(this Object testedObject)
    {
        return (testedObject is IEnumerable<T>);
    }
}
 

4voto

Heinzi Points 66519

i est du type NS.1.Program+<GetInts>d__0 , qui est un sous - type de IEnumerable<int> . Ainsi, vous pouvez utiliser soit

 if (i is IEnumerable<int>) { ... }
 

ou IsAssignableFrom (comme dans la réponse de Marc ).

1voto

tster Points 9948

Vous pouvez utiliser le mot clé is .

 [TestFixture]
class Program
{
    static IEnumerable<int> GetInts()
    {
        yield return 1;
    }

    [Test]
    static void Maasd()
    {
        var i = GetInts();
        Assert.IsTrue(i is IEnumerable<int>);
    }
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X