Retorno del método de extensión usando genéricos

¿Es posible devolver un genérico escribir usando métodos de extensión?

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

Actualmente se utiliza de la siguiente manera:

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 y, de ser así, cómo sería el método?

preguntado el 09 de enero de 11 a las 02:01

Por cierto, para que lo sepas, simplemente puedes escribir "valor doble = fila.Get (" tangible-equity ");" y omita el " "porque el compilador lo resolverá -

3 Respuestas

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

Respondido el 09 de enero de 11 a las 20:01

debe admitir todos los tipos que implementan IConvertible - Vidrio roto

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

Respondido el 09 de enero de 11 a las 05:01

System.InvalidCastException: la conversión especificada no es válida. - Steven de Salas

Eso sucederá si la columna de su base de datos no es del mismo tipo que la respuesta de T. @ BrokenGlass debería convertir correctamente objetos de diferentes tipos. - sgriffinusa

Eso sucederá con suficiente frecuencia al manejar tipos de datos de la base de datos: Steven de Salas

Acordado. Es mejor usar Convert.ChangeType () - Mahesh Velaga

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

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

Respondido el 09 de enero de 11 a las 05:01

No es Linq. Es solo un método de extensión en DataRow. Es casi exactamente lo que está intentando construir. - sgriffinusa

Creo que tienes que agregar una referencia a System.Data.DataSetExtensions.dll - Steven de Salas

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.