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 est OK Le résultat est le suivant:
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>)));
}
}
}
Si vous voulez dire la collection , alors as
:
var asEnumerable = i as IEnumerable<int>;
if(asEnumerable != null) { ... }
Cependant, je suppose (d'après l'exemple) que vous avez un Type
:
Object ne sera jamais "de" type IEnumerable<int>
- mais il pourrait implémenter le; Je m'attendrais à ce que:
if(typeof(IEnumerable<int>).IsAssignableFrom(type)) {...}
ferait. Si vous ne connaissez pas la T
(int
ci-dessus), vérifiez toutes les interfaces implémentées:
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 appelez:
Type t = GetEnumerableType(type);
si c'est null, ce n'est pas IEnumerable<T>
pour une T
- sinon, cochez t
.
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);
}
}
}
Puisque IEnumerable <T> hérite de IEnumerable (non générique) et si vous n'avez pas besoin de savoir quand un type est juste IEnumerable et non IEnumerable <T>, vous pouvez utiliser:
if (typeof(IEnumerable).IsAssignableFrom(srcType))
Comment déterminer si un 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 Object pour 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>);
}
}
i
est de 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).
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>);
}
}
Comment détecter si le type est un autre type générique devrait vous aider avec cela.