C# 使用泛型返回扩展方法
是否可以使用返回类型 例如,我有以下方法:C# 使用泛型返回扩展方法,c#,generics,extension-methods,C#,Generics,Extension Methods,是否可以使用返回类型 例如,我有以下方法: // 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 val
// 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;
}
目前使用的方法如下:
double value = row.GetDouble("tangible-equity");
但我想使用以下代码:
double value = row.Get<double>("tangible-equity");
double value=row.Get(“有形权益”);
这可能吗?如果可能,该方法会是什么样子?这是可能的。它可以是如下所示:
// 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);
}
//获取行内字段的方便方法(作为T类型)
公共静态T Get(此数据行,字符串字段){
if(row!=null&&row.Table.Columns.Contains(字段))
{
对象值=行[字段];
if(value!=null&&value!=DBNull.value)
返回(T)值;
}
返回默认值(T);
}
DataRow有一个名为的扩展方法,该方法将完成您正在尝试做的事情。我不确定它在double上使用null值时的行为(我知道它将处理可为null的类型)。这可能不是你想要的,但值得一看
double value = row.Field<double>("tangible-equity");
double value=行字段(“有形权益”);
这个怎么样:
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);
}
public static T Get(此数据行,字符串字段),其中T:IConvertible
{
if(row!=null&&row.Table.Columns.Contains(字段))
{
对象值=行[字段];
if(value!=null&&value!=DBNull.value)
return(T)Convert.ChangeType(value,typeof(T));
}
返回默认值(T);
}
处理转换要比只进行转换灵活得多。这几乎反映了您的原始代码,只是泛型。它不是Linq。它只是DataRow上的一个扩展方法。这几乎正是您试图构建的内容。我认为您必须向System.Data.DataSetExtensions.dllSystem.InvalidCastException添加ref:指定的强制转换无效。如果您的数据库列与T的类型不同,则会发生这种情况。@BrokenGlass的答案应该正确转换不同类型的对象。这种情况经常发生从数据库处理数据类型。更好地使用Convert.ChangeType()应该支持实现IConvertibleBTW的所有类型,正如您所知,您只需编写“double value=row.Get(“有形权益”);”并跳过“”,因为编译器会解决它