C# Language Méthodes d'extension génériques


Exemple

Tout comme d'autres méthodes, les méthodes d'extension peuvent utiliser des génériques. Par exemple:

static class Extensions
{
    public static bool HasMoreThanThreeElements<T>(this IEnumerable<T> enumerable)
    {
        return enumerable.Take(4).Count() > 3;
    }
}

et l'appel serait comme:

IEnumerable<int> numbers = new List<int> {1,2,3,4,5,6};
var hasMoreThanThreeElements = numbers.HasMoreThanThreeElements();

Voir la démo

De même pour plusieurs arguments de type:

public static TU GenericExt<T, TU>(this T obj)
{
     TU ret = default(TU);
     // do some stuff with obj
     return ret;
}

L'appeler serait comme:

IEnumerable<int> numbers = new List<int> {1,2,3,4,5,6};
var result = numbers.GenericExt<IEnumerable<int>,String>();

Voir la démo

Vous pouvez également créer des méthodes d'extension pour les types partiellement liés dans les types multi-génériques:

class MyType<T1, T2>
{
}

static class Extensions
{
    public static void Example<T>(this MyType<int, T> test)
    {        
    }
}

L'appeler serait comme:

MyType<int, string> t = new MyType<int, string>();
t.Example();

Voir la démo

Vous pouvez également spécifier des contraintes de type avec where :

public static bool IsDefault<T>(this T obj) where T : struct, IEquatable<T>
{
     return EqualityComparer<T>.Default.Equals(obj, default(T));
}

Code d'appel:

int number = 5;
var IsDefault = number.IsDefault();

Voir la démo