C# C Int64转换器无法从System转换。将DataRow转换为T类型时发生Int64错误
我正在尝试将SQL表中的所有记录作为IEnumerable返回到EmailAccount的可枚举集合,例如EmailAccount表结果。我使用一个名为SelectAll的方法,该方法执行一个SQL脚本,然后以可枚举的形式返回数据表 问题是,当尝试使用GetItem方法将Int64类型表中的某些列转换为具有long类型匹配属性的T对象时,在“pro.SetValueobj,typeConverter.ConvertFromdr[column.ColumnName],null;”行出现错误“Int64Converter无法从System.Int64转换” 关于如何将Int64值从表结果转换为long属性,有什么建议吗C# C Int64转换器无法从System转换。将DataRow转换为T类型时发生Int64错误,c#,generics,C#,Generics,我正在尝试将SQL表中的所有记录作为IEnumerable返回到EmailAccount的可枚举集合,例如EmailAccount表结果。我使用一个名为SelectAll的方法,该方法执行一个SQL脚本,然后以可枚举的形式返回数据表 问题是,当尝试使用GetItem方法将Int64类型表中的某些列转换为具有long类型匹配属性的T对象时,在“pro.SetValueobj,typeConverter.ConvertFromdr[column.ColumnName],null;”行出现错误“Int
public void Test()
{
var results = SelectAll<EmailAccount>();
....
}
public class EmailAccount
{
public long Id { get; set; }
public string Name { get; set; }
public ImapEnum ImapType { get; set; }
}
public IEnumerable<T> SelectAll<T>() where T : new()
{
var tableName = "EmailAccount"; // TableName<T>();
var results = ExecuteReader($"SELECT * FROM {tableName};");
if (results == null || results.Rows.Count == 0) return null;
return results.AsEnumerable().Select(GetItem<T>);
}
private static T GetItem<T>(DataRow dr)
{
var temp = typeof(T);
var obj = Activator.CreateInstance<T>();
foreach (DataColumn column in dr.Table.Columns)
{
foreach (var pro in temp.GetProperties())
{
if (pro.Name == column.ColumnName)
{
if (pro.PropertyType == typeof(Enum) || pro.PropertyType.BaseType == typeof(Enum))
{
pro.SetValue(obj, Enum<StringComparison>.ToObject(dr[column.ColumnName]), null);
}
else
{
var typeConverter = TypeDescriptor.GetConverter(pro.PropertyType);
pro.SetValue(obj, typeConverter.ConvertFrom(dr[column.ColumnName]), null);
}
}
else
continue;
}
}
return obj;
}
Int64Converter只能作用于字符串对象 此转换器只能将64位有符号整数对象与字符串进行转换 因此,我建议您使用此代码-
pro.SetValue(obj, typeConverter.ConvertFrom(dr[column.ColumnName].ToString()), null);
TypeConverter类通常用于在T和字符串之间进行转换。在您的例子中,dr[column.ColumnName]其中column.ColumnName是Id,结果是一个很长的时间,因此不需要转换或强制转换。如果类包含数据库不支持的类型,则需要使用类型转换器。这很可能是任何非基本类型。作为问题的解决方案,您可以使用:
var value = dr[column.ColumnName];
if (pro.PropertyType == typeof(Enum) || pro.PropertyType.BaseType == typeof(Enum))
{
pro.SetValue(obj, Enum<StringComparison>.ToObject(value), null);
}
else if(prop.PropertyType().IsAssignableFrom(value.GetType())
{
pro.SetValue(obj, value);
}
else
{
var typeConverter = TypeDescriptor.GetConverter(pro.PropertyType);
pro.SetValue(obj, typeConverter.ConvertFrom(value), null);
}
我不知道。这对一些数据场景很有帮助。谢谢,添加IsAssignableFrom检查有效。