54 Stimmen

Ermitteln, ob die Sammlung vom Typ IEnumerable<T> ist

Wie lässt sich feststellen, ob ein Objekt vom Typ IEnumerable <T> ist?

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());
        }
    }
}

Ausgabe:

NS.1.Program+<GetInts>d__0

Wenn ich GetInts so ändere, dass es IList zurückgibt, ist alles in Ordnung die Ausgabe ist:

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

Und das Ergebnis ist falsch:

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>)));
        }
    }
}

1voto

tster Punkte 17284

Sie können die is Stichwort.

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

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

0voto

Pham Bien Punkte 31

Versuchen Sie

type.GetInterface("IEnumerable") != null && type.IsGenericType

0voto

Jonathan Tiefer Punkte 11

Ich glaube, der beste Weg, dies zu lösen, sollte einfach sein Sie schreiben zunächst Code, der die generischen Argumente (oder in Ihrem Fall Argumente) der IEnumerable<T> schreiben Sie dann eine weitere Zeile, um einen Vergleich zwischen dem Typ des Arguments, das Sie mit dem Typ, der in der Datei IEnumerable<T> Objekt ( int in Ihrem Fall). Ich habe ein Beispiel, das zwei einfache Funktionen zeigt, die beide Aufgaben erledigen.

    public static Type GetEnumerableArgumentType(Type type)
    {
        if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IEnumerable<>))
            return type.GetGenericArguments()[0];
        else
            return null;            
    }        

    public static bool EnumerableContainsArgumentType(Type tEnumerable, Type tGenArg)
    {
        return GetEnumerableArgumentType(tEnumerable) == tGenArg;
    }

0voto

Henry Puspurs Punkte 76

Für alle, die auf der Suche nach diesem, die nur wissen will, wie man true oder false auf zurückgeben, wenn ein Objekt ist oder erbt von IEnumerable, habe ich Marcs ursprüngliche Antwort verwendet, um diese generische Methode zu erstellen, die ich jetzt verwende.

private static bool ImplementsIEnumerable<T>(T obj)
    {
        var type = obj.GetType();
        if (type.IsInterface && type.GetGenericTypeDefinition() == typeof(IEnumerable<>))
        {
            return true;
        }
        foreach (Type interfaceUsed in type.GetInterfaces())
        {
            if (interfaceUsed.IsGenericType
                && interfaceUsed.GetGenericTypeDefinition() == typeof(IEnumerable<>))
            {
                return true;
            }
        }
        return false;
    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X