2011-01-22 5 views
10

So che è possibile sovrascrivere il metodo ToString() di un oggetto, in modo che ogni volta che si richiama un oggetto o lo si passi a una funzione che richiede un tipo di stringa verrà convertito in stringa.Conversione di tipo automatico in C#

ho scritto diversi metodi di estensione per il tipo di oggetto 'oggetto'

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()); 
} 

modo che ho potuto solo chiamarli così:

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

Tuttavia, quello che voglio realizzare è quello di convertire gli oggetti riga di tipo 'oggetto' al tipo corretto in base ai tipi di proprietà sul mio 'eventObject'. Quindi, potrei chiamarlo così:

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

La riga è un DataRow se questo è importante.

+6

Perché non usi solo la classe di conversione? http://msdn.microsoft.com/en-us/library/system.convert.aspx - E no, non è possibile ottenere la conversione del tipo silenzioso come il tuo ultimo codice, a meno che tu non faccia "riga [x]" restituisca un oggetto personalizzato che sa come eseguire il casting implicito. –

+0

+1 @Lasse L'uso della classe Convert è preferibile per spackling 'Object' con metodi di utilità. –

+0

utilizzerà ora, pensavo che non ci fosse alcuna differenza –

risposta

24

C# supporta implicit la conversione per i tipi e si può utilizzare per i tipi personalizzati come il seguente:

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 
    } 
} 

e supporta extension methods, ma non supporto per la conversione implicita come un metodo di estensione come il seguente :

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

potrei aggiungere operatori impliciti per System.Data.DataRow? –

+0

No, non è possibile perché è disponibile solo tipi definiti dall'utente. – Homam

+0

È possibile combinare un metodo di estensione 'ToCustomValue' – CodesInChaos

0

Credo che quello che stai cercando sia la conversione implicita, che è descritta qui: http://msdn.microsoft.com/en-us/library/z5z9kes2.aspx.

Tuttavia, l'aggiunta di questi a oggetto sarebbe una pessima idea, per motivi illustrati nella pagina a cui mi sono collegato.

1

so che si potrebbe ignorare ToString di un oggetto () Meth od, in modo che ogni volta che si chiama un oggetto o passare a una funzione che richiede un tipo di stringa verrà convertito in una stringa .

No, si sbaglia. Il seguente codice non viene compilato:

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

static void MyMethod(string s) { } 

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

Il compilatore non sarà possibile ottenere il tipo di MyMethod parametro (che è string), primo e cercare di convertire l'argomento passato (il cui tipo è MyClass) ad esso. Immagino che tu sia probabilmente fuorviato da qualcosa come Console.WriteLine. Base sul codice di cui sopra, Console.WriteLine(new MyClass()) stampe "MyClass" alla console, è sembra che il compilatore sa si dovrebbe passare una stringa di Console.WriteLine e cercare di convertire MyClass a stringa. Ma l'essenziale è Console.WriteLine ha diversi overload, uno di loro è per object:

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

Perdonatemi se sto affermando l'ovvio ma ho avuto questa impressione dopo aver letto la tua domanda.

Sapete che il tipo di base di ogni tipo in .NET è giusto? Quindi la colonna nel datarow che descrivi di tipo oggetto potrebbe anche essere dello stesso tipo del membro che stai cercando di assegnare e quindi è necessario un cast semplice.

per esempio

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

0

Per riassumere: è sufficiente definire questi metodi ed è possibile utilizzare oggetti di classe Test nei metodi che richiedono String come parametro.

class Test 
{ 
    private String txt; 

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

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