Close2
ZephOn the 2009-07-28 at 01:51pm
Hello,

Pour ne pas changer, j'ai un petit problème de C# grin

J'ai défini quelque part une série de méthodes surchargées de ce style :
public static class Machin
{
    Int32 Methode (A value) { ... }
    Int32 Methode (B value) { ... }
    Int32 Methode (C value) { ... }
}

Je voudrais ensuite les utiliser au sein d'une classe générique, mettons "MaClasse<T>". Cette classe possède une méthode comme celle-ci :
class MaClasse<T>
{
    public void Test (T value)
    {
        Console.WriteLine (Machin.Methode (value));
    }
}

Le problème est que rien ne dit que "Machin.Methode" est valide pour le type T. Par ailleurs je ne peux pas toucher à A, B et C puisque ce sont des types de base comme String, DateTime ou Color.

L'idéal serait d'avoir une contrainte du style "where T in A, B, C", mais à ma connaissance on ne peut pas définir ce type de contrainte en C#. Pour l'instant j'ai donc été obligé de laisser la méthode "Test" abstraite et de définir "MaClasseString : MaClasse<String>", "MaClasseDateTime : MaClasse<DateTime>" et ainsi de suite, mais ça me fait créer tout un paquet de classes qui n'implémentent qu'une seule méthode qui s'écrit rigoureusement de la même façon à chaque fois :
abstract class MaClasse<T>
{
    public abstract void Test (T value);
}

class MaClasseString : MaClasse<String>
{
    public override void Test (String value)
    {
        Console.WriteLine (Machin.Methode (value));
    }
}

class MaClasseDateTime : MaClasse<DateTime>
{
    public override void Test (DateTime value)
    {
        Console.WriteLine (Machin.Methode (value));
    }
}

// ... etc.

Bref, beaucoup de code redondant pour rien. Existe-t-il une solution plus propre ?

Merci ^^