C# C Int64转换器无法从System转换。将DataRow转换为T类型时发生Int64错误

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

我正在尝试将SQL表中的所有记录作为IEnumerable返回到EmailAccount的可枚举集合,例如EmailAccount表结果。我使用一个名为SelectAll的方法,该方法执行一个SQL脚本,然后以可枚举的形式返回数据表

问题是,当尝试使用GetItem方法将Int64类型表中的某些列转换为具有long类型匹配属性的T对象时,在“pro.SetValueobj,typeConverter.ConvertFromdr[column.ColumnName],null;”行出现错误“Int64Converter无法从System.Int64转换”

关于如何将Int64值从表结果转换为long属性,有什么建议吗

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检查有效。