Is it possib开发者_如何学Pythonle 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?
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.
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);
}
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");
精彩评论