2011-01-09 20 views
6

¿Es posible devolver un tipo generic usando extension methods?Retorno de método de extensión usando genéricos

Por ejemplo, tengo el siguiente método:

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

Esto se utiliza actualmente como sigue:

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

pero me gustaría usar el siguiente código:

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

¿Es esto posible? De ser así, ¿cómo se vería el método?

+0

Por cierto, para que lo sepas, simplemente puedes escribir "double value = row.Get (" tangible-equity ");" y omita el "" porque el compilador lo resolverá –

Respuesta

12

¿Qué tal este:

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 es mucho conversiones de manejo más flexibles en lugar de sólo la fundición. Esto refleja bastante su código original, solo genérico.

+2

+1 para Convert.ChangeType –

+0

Funciona con y donde el código de Mahesh no –

+0

+1 estuvo de acuerdo. Es mejor utilizar Convert.ChangeType() –

3

Es posible. Podría ser algo como lo siguiente:

// 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: el molde especificado no es válido. –

+0

Eso sucederá si la columna de su base de datos no es del mismo tipo que T. @ La respuesta de BrokenGlass debe convertir correctamente objetos de diferentes tipos. – sgriffinusa

+0

Eso sucederá con suficiente frecuencia manejando los tipos de datos del DB –

1

El DataRow tiene un método de extensión llamado Field que hará mucho lo que está tratando de hacer. No estoy exactamente seguro de cómo se comportará con un valor nulo en un doble (sé que manejará tipos anulables). Puede que esto no sea exactamente lo que estás buscando, pero vale la pena echarle un vistazo.

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

Me mantengo alejado de Linq por lo que no hay campo () método disponible –

+0

No es Linq. Es solo un método de extensión en DataRow. Es casi exactamente lo que intentas construir. – sgriffinusa

+0

Creo que tiene que agregar ref a System.Data.DataSetExtensions.dll –

Cuestiones relacionadas