15 votes

Étendre System.Convert

System.Convert a une utilité vraiment utile pour convertir des types de données d'un type à un autre. Dans mon projet, j'ai de nombreux types personnalisés. Je veux convertir les arguments de ligne de commande en ces types personnalisés (certains d'entre eux sont assez complexes). Ce serait bien si cela existait dans System.Convert pour que je puisse simplement faire quelque chose comme ceci :

Convert.ToMyCustomType(args[1])

J'aimerais que cela apparaisse dans l'IDE Visual C# lorsque je tape. Je sais que je pourrais simplement créer une routine pour convertir des types, mais je voudrais que les conversions de types soient gérées de la même manière que ce qui est déjà intégré dans le framework. Est-ce que quelqu'un a réussi à le faire dans le passé ?

17voto

Jon Skeet Points 692016

Non, vous ne pouvez pas les ajouter à la classe Convert - Je recommanderais d'ajouter des méthodes de conversion à vos types actuels, telles que:

MyCustomType.FromInt32(...)

et des méthodes d'instance allant dans l'autre sens:

int x = myCustomType.ToInt32();

(Les méthodes de fabrique statiques sont souvent meilleures que d'ajouter beaucoup de constructeurs surchargés, à mon avis. Elles permettent diverses alternatives - y compris renvoyer une valeur nulle lorsque c'est approprié, ou mettre en cache - et peuvent rendre le code d'appel plus clair.)

Je recommanderais également vivement de ne pas aller trop loin dans le nombre de conversions que vous fournissez. Pas beaucoup de types personnalisés ont vraiment une seule conversion naturelle à partir de tous les types primitifs.

2voto

phoog Points 22667

Tout d'abord, System.Convert n'est pas un espace de noms; c'est une classe statique (voir la documentation pour plus d'informations). Vous pouvez écrire votre propre classe Convert!

static class Convert
{
    static MyCustomType ToMyCustomType(string value)
    {
         //logique ici...
    }
}

Si vous voulez utiliser cette classe dans le même fichier où vous utilisez System.Convert, vous voudrez peut-être lui donner un autre nom, pour réduire l'ambiguïté.

2voto

Malheureusement, System.Convert est une classe statique et vous ne pouvez pas étendre les classes statiques. Vous ne pouvez dériver que des classes statiques de object.


Une façon possible de procéder est de fournir des opérateurs de conversion (implicites ou explicites)

public class MyClass
{
    public static explicit operator MyClass(SomeOtherType other)
    {
        return new MyClass { /* TODO: provide a conversion here*/ };
    }

    public static explicit operator SomeOtherType(MyClass x)
    {
        return new SomeOtherType {  /* TODO: provide a conversion here*/ };
    }
}

Avec cette déclaration, vous pouvez faire ceci

MyClass myClass = new MyClass();
SomeOtherType other = (SomeOtherType)myClass;

ou ceci

SomeOtherType other = new SomeOtherType();
MyClass myClass = (MyClass)other;

0voto

Raj Nagalingam Points 1048

Convertir est une classe statique, que vous ne pouvez pas étendre.

Cependant, vous pouvez utiliser Convert.ChangeType() pour vos besoins.

0voto

SteveCinq Points 712

Si vous connaissez le type - ou les types - à partir desquels vous allez convertir, vous pouvez utiliser des méthodes d'extension (mais pas de System.Convert, comme mentionné ailleurs).

Par exemple, pour convertir en une chaîne hexadécimale à partir d'un tableau de bytes (par exemple, lorsque vous voulez une chaîne hexadécimale joliment formatée à partir d'un hachage), vous pouvez faire ceci :

''' Convertit un tableau de bytes en une chaîne hexadécimale.
''' Requis. Le tableau de bytes à convertir.
''' Une chaîne hexadécimale si la conversion a réussi, une erreur sinon.

Public Function [ToHexString](
    ByVal Item As Byte()) As String

    Dim Result As String = ""
    If Item IsNot Nothing Then
        For Each b As Byte In Item
            Result += b.ToString("X2")
        Next b
    End If
    Return Result
End Function

Utilisation :

Dim myHexString As String = myByteArray.ToHexString()

Résultat :

FEE53B1AB64BD74AF8A95A9D4078141F196BA7A3

Vous pouvez ajouter un paramètre optionnel pour sélectionner majuscules ou minuscules dans le résultat si vous voulez être chic.

Et vous pouvez surcharger les méthodes en fonction du type que vous convertissez, ainsi vous pourriez en avoir une pour convertir depuis, disons, Long (bien que ce soit déjà faisable avec les fonctions standard de String).

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