2012-04-17 14 views
10

System.Convert tiene una utilidad realmente útil para convertir tipos de datos de un tipo a otro. En mi proyecto, tengo muchos tipos personalizados. Quiero convertir argumentos de línea de comandos a estos tipos personalizados (algunos de los cuales son bastante complejos). Sería bueno si éstos existieron dentro System.Convert por lo que sólo podía hacer algo como esto:Extendiendo System.Convert

Convert.ToMyCustomType(args[1]) 

me gustaría para que esto se mostrará en el C# IDE de Visual mientras escribo. Sé que podría simplemente crear una rutina para convertir tipos, pero me gustaría que las conversiones de tipo se manejen de la misma manera que lo que ya está incorporado en el marco. ¿Alguien ha tenido éxito haciendo esto en el pasado?

+1

¿Qué le daría tal cosa sobre los métodos de extensión? – Oded

+1

@Oded: Convert es una clase estática. –

+0

@JonSkeet - Por supuesto que es ... no estaba pensando. – Oded

Respuesta

14

No, no se puede agregar a la clase Convert - Yo sugeriría la adición de métodos de conversión a los tipos reales, tales como:

MyCustomType.FromInt32(...) 

y métodos de instancia en la otra dirección:

int x = myCustomType.ToInt32(); 

(Los métodos de fábrica estáticos a menudo son mejores que agregar muchos constructores sobrecargados, IMO. Permiten varias alternativas, incluido devolver un valor nulo cuando corresponda, o almacenar en caché y pueden aclarar el código de llamada)

Yo también recomendaría encarecidamente que no vaya por la borda en la cantidad de conversiones que suministre. No muchos tipos personalizados realmente tienen una única conversión natural de todo tipo de tipos primitivos.

+1

Probablemente sea la segunda mejor opción. ¡Gracias! –

2

Primero, System.Convert no es un espacio de nombres; es una clase estática (ver documentation para más información). ¡Puedes escribir tu propia clase Convert!

static class Convert 
{ 
    static MyCustomType ToMyCustomType(string value) 
    { 
     //logic here... 
    } 
} 

Si desea utilizar esta clase en el mismo archivo donde se está utilizando System.Convert, es posible que desee darle otro nombre, para reducir la ambigüedad.

3

Desafortunadamente System.Convert es una clase estática y no puede ampliar las clases estáticas. Solo puede derivar clases estáticas desde object.


Un posible camino a seguir, es proporcionar a los operadores de conversión (ya sea implícita o explícita)

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*/ }; 
    } 
} 

Con esta declaración se puede hacer esto

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

o esta

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

Convert es una clase estática, que no puedes extender. No se puede usar Convert.ChangeType() para sus necesidades.