2011-01-09 12 views
6

È possibile restituire un tipo generic utilizzando extension methods?Metodo di ritorno restituito tramite generici

Ad esempio, ho il seguente metodo:

// Convenience method to obtain a field within a row (as a double type) 
public static double GetDouble(this DataRow row, string field) { 
    if (row != null && row.Table.Columns.Contains(field)) 
    { 
     object value = row[field]; 
     if (value != null && value != DBNull.Value) 
      return Convert.ToDouble(value); 
    } 
    return 0; 
} 

Questo è attualmente utilizzato come segue:

double value = row.GetDouble("tangible-equity"); 

ma desidero utilizzare il codice seguente:

double value = row.Get<double>("tangible-equity"); 

È possibile e, in tal caso, quale sarebbe il metodo?

+0

BTW, solo per quello che sai, puoi semplicemente scrivere "double value = row.Get (" tangible-equity ");" e salta "" perché il compilatore lo scoprirà. –

risposta

12

Che ne dite di questo:

public static T Get<T>(this DataRow row, string field) where T: IConvertible 
    { 
     if (row != null && row.Table.Columns.Contains(field)) 
     { 
      object value = row[field]; 
      if (value != null && value != DBNull.Value) 
       return (T)Convert.ChangeType(value, typeof(T)); 
     } 
     return default(T); 
    } 

Convert.ChangeType è molto di conversioni di gestione più flessibili in contrasto con appena colata. Questo riflette più o meno il tuo codice originale, solo generico.

+2

+1 per il Convert.ChangeType –

+0

Funziona con e dove il codice di Mahesh non ha –

+0

+1 concordato. Meglio usare Convert.ChangeType() –

3

È possibile. Potrebbe essere qualcosa di simile al seguente:

// Convenience method to obtain a field within a row (as a T type) 
public static T Get<T>(this DataRow row, string field) { 
    if (row != null && row.Table.Columns.Contains(field)) 
    { 
     object value = row[field]; 
     if (value != null && value != DBNull.Value) 
      return (T)value; 
    } 
    return default(T); 
} 
+0

System.InvalidCastException: Il cast specificato non è valido. –

+0

Ciò accade se la colonna del database non è dello stesso tipo di T. La risposta di BrokenGlass deve convertire correttamente oggetti di tipi diversi. – sgriffinusa

+0

Ciò succederà spesso abbastanza gestendo i tipi di dati dal DB –

1

Il DataRow ha un metodo di estensione chiamato Field che farà molto quello che si sta cercando di fare. Non sono esattamente sicuro di come si comporterà con un valore nullo su un doppio (so che gestirà i tipi nullable). Questo potrebbe non essere esattamente quello che stai cercando, ma vale la pena dare un'occhiata.

double value = row.Field<double>("tangible-equity"); 
+0

Non mi trovo a Linq, quindi non c'è il campo () metodo disponibile –

+0

Non è Linq. È solo un metodo di estensione su DataRow. È quasi esattamente quello che stai cercando di costruire. – sgriffinusa

+0

Penso che devi aggiungere ref a System.Data.DataSetExtensions.dll –

Problemi correlati