2011-01-22 14 views
10

Sé que podría anular el método ToString() de un objeto, de modo que cada vez que llame a un objeto o lo pase a una función que requiera un tipo String, se convertirá en String.Conversión de tipo automático en C#

He escrito varios métodos de extensión para el tipo de objeto 'objeto'

public static DateTime ToDate(this object date) 
{ 
    return DateTime.Parse(date.ToString()); 
} 

public static int ToInteger(this object num) 
{ 
    return Int32.Parse(num.ToString()); 
} 

public static long ToLong(this object num) 
{ 
    return Int64.Parse(num.ToString()); 
} 

de manera que solo podía llamar a ellos de esta manera:

eventObject.Cost = row["cost"].ToString(); 
eventObject.EventId = row["event_id"].ToLong(); 

Sin embargo, lo que quiero lograr es convertir los objetos de fila que son de tipo 'objeto' a su tipo correcto en función de los tipos de propiedad en mi 'eventObject'. Entonces, podría llamarlo así:

eventObject.Cost = row["cost"]; 
eventObject.EventId = row["event_id"]; 

La fila es un DataRow si eso es importante.

+6

¿Por qué no solo utiliza la clase Convert? http://msdn.microsoft.com/en-us/library/system.convert.aspx - Y no, no puede obtener la conversión de tipo silencioso como su último código allí, a menos que haga que "row [x]" devuelva un objeto personalizado que sabe cómo hacer la conversión implícita. –

+0

+1 @Lasse El uso de la clase Convert es preferible al 'Objeto' de spackling con métodos de utilidad. –

+0

utilizará ahora, pensó que no tenía ninguna diferencia –

Respuesta

24

C# soporta implicit conversión de tipos y se puede utilizar para sus tipos personalizados como el siguiente:

class CustomValue 
{ 
    public static implicit operator int(CustomValue v) { return 4; } 

    public static implicit operator float(CustomValue v) { return 4.6f; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     int x = new CustomValue(); // implicit conversion 
     float xx = new CustomValue(); // implicit conversion 
    } 
} 

Y apoya extension methods, pero no apoyo conversión implícita como un método de extensión como el siguiente :

static class MyExtension 
{ 
    // Not supported 
    public static implicit operator bool(this CustomValue v) 
    { 
     return false; 
    } 
} 
+0

¿podría agregar operadores implícitos para System.Data.DataRow? –

+0

No, no puede porque solo está disponible para tipos definidos por el usuario. – Homam

+0

Puedes combinarlo como un método de extensión 'ToCustomValue' – CodesInChaos

1

sé que usted podría anular ToString de un objeto () Meth od, para que cada vez que llame a un objeto o pase a una función que requiera un tipo de cadena , se convierta en una cadena .

No, estás equivocado. El siguiente código no se compilará:

class MyClass 
{ 
    public override string ToString() 
    { 
     return "MyClass"; 
    } 
} 

static void MyMethod(string s) { } 

static void Main(string[] args) 
{ 
    MyMethod(new MyClass()); //compile error 
} 

El compilador no obtener el tipo de MyMethod parámetro (que es string) primero y tratar de convertir el argumento de que ha pasado (cuyo tipo es MyClass) a la misma. Supongo que probablemente te confundas con algo como Console.WriteLine. Base en el código anterior, Console.WriteLine(new MyClass()) impresiones "MyClass" a la consola, que parece que el compilador sabe que debe pasar una cadena a Console.WriteLine y tratar de convertir a MyClass cadena. Pero lo esencial es Console.WriteLine tiene varias sobrecargas, una de ellas es para object:

//from Console.cs 
public static void WriteLine(object value) 
{ 
    //in this method there is something like 
    //Console.WriteLine(value.ToString()); 
} 
0

Perdóname si estoy afirmando lo obvio pero tengo esta impresión después de leer su pregunta.

Sabes que el tipo de línea de cada tipo en .NET es un objeto ¿no? Por lo tanto, la columna en el datarow que usted describe de tipo objeto también podría ser del mismo tipo que el miembro que está tratando de asignar y luego se necesita un simple molde.

por ejemplo

eventObject.EventId = (int) fila [ "event_id"];

0

En resumen, simplemente defina estos métodos y puede usar objetos de la clase Prueba en métodos que requieren String como parámetro.

class Test 
{ 
    private String txt; 

    public static implicit operator string(Test t) 
    { 
     return t.ToString(); 
    } 

    public override string ToString() 
    { 
     return txt; 
    } 
}