Reputation: 21447
Is it possible to return a generic type using extension methods?
For example, I have the following method:
// 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;
}
This is currently used as follows:
double value = row.GetDouble("tangible-equity");
but I would like to use the following code:
double value = row.Get<double>("tangible-equity");
Is this possible and if so, what would the method look like?
Upvotes: 10
Views: 4655
Reputation: 160852
How about this one:
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 is much more flexible handling conversions as opposed to just casting. This pretty much reflects your original code, just generic.
Upvotes: 18
Reputation: 4221
The DataRow has an extension method called Field that will do very much what you are trying to do. I'm not exactly sure how it will behave with a null value on a double (I know it will handle nullable types). This may not be exactly what you are looking for, but is worth a look.
double value = row.Field<double>("tangible-equity");
Upvotes: 1
Reputation: 21991
It is possible. It could be something like the following:
// 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);
}
Upvotes: 3