【问题标题】:Object of type 'System.Double' cannot be converted to type 'System.Int32'“System.Double”类型的对象无法转换为“System.Int32”类型
【发布时间】:2014-11-26 06:12:36
【问题描述】:

我的代码遇到问题,它告诉system.int32 不能转换为system.double,这是我的代码

我有一个包含 4 个字符串变量和 2 个整数变量的对象。

public class MyObject
{
public int id;
public string name1;
public string name2;
public string name3;
public string name4;
public int id2;

}

/*Converts DataTable To List*/
    public static List<TSource> ToList<TSource>(this DataTable dataTable) where TSource : new()
    {
        var dataList = new List<TSource>();

        const BindingFlags flags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic;
        var objFieldNames = (from PropertyInfo aProp in typeof(TSource).GetProperties(flags)
                             select new { Name = aProp.Name, Type = Nullable.GetUnderlyingType(aProp.PropertyType) ?? aProp.PropertyType }).ToList();
        var dataTblFieldNames = (from DataColumn aHeader in dataTable.Columns
                                 select new { Name = aHeader.ColumnName, Type = aHeader.DataType }).ToList();
        var commonFields = objFieldNames.Intersect(dataTblFieldNames).ToList();

        foreach (DataRow dataRow in dataTable.AsEnumerable().ToList())
        {
            var aTSource = new TSource();
            foreach (var aField in objFieldNames)
            {
                PropertyInfo propertyInfos = aTSource.GetType().GetProperty(aField.Name);
                propertyInfos.SetValue(aTSource, dataRow[aField.Name], null);
            }
            dataList.Add(aTSource);
        }
        return dataList;
    }

在我的 objectfieldname 变量中,我得到了所有具有正确数据类型的变量,但在 dataTblFieldNames 变量中,它会将 int 转换为 double,所以我在 propertyinfos 中遇到问题 foreach loop 它的说法

“System.Double”类型的对象无法转换为“System.Int32”类型。?

有人帮我解决这个问题吗?

【问题讨论】:

  • 错误在哪里?你在哪里转换它?
  • 我不敢相信您编写了 Reflection/LinQ,而现在您在进行简单的 Int32/double 转换时遇到了问题。哪条线?
  • 所以我在 foreach 循环中的 propertyinfos.setvalue 中遇到问题,它说“System.Double”类型的对象无法转换为“System.Int32”类型。?

标签: c# asp.net .net asp.net-mvc


【解决方案1】:

你可以使用Convert.ChangeType method:

Convert.ChangeType(dataRow[aField.Name], propertyInfos.PropertyType)

它会尝试一些数字转换(比如从doubleint 的转换,二进制表示从浮点到整数(2 的补码)的变化)和一些格式/解析到/从string

【讨论】:

    【解决方案2】:

    你在赋值之前已经找到了属性类型,你还必须将值转换为所需的类型,因为你不能直接将 double 类型分配给 int 类型。

    if (propertyInfos.PropertyType == typeof(int))
    {
        propertyInfos.SetValue(aTSource, Convert.ToInt32(dataRow[aField.Name]), null);
    }
    

    【讨论】:

    • 非常感谢,它的工作完美。 Atlast one 正确理解了我的问题。
    • 但是有一个问题,为什么它在设置期间将其视为双精度,实际上数据类型只是 int。
    • @user1557020 检查来自数据表的值。我认为它是双重的。
    【解决方案3】:

    您的输入dataRow[aField.Name] 的类型为System.Double,而您要分配的字段的类型为System.Int32。但是 Visual Studio 已经告诉你如此响亮和清晰。

    我无法告诉你该怎么做,因为我不知道你想要做什么。通过强制转换截断双精度数?向上还是向下舍入?也许这完全是错误的领域?我们不知道。你决定。

    考虑到您不太可能提出上述代码但仍然不理解错误,也许最好睡一觉和喝一杯好咖啡,或者询问最初编写此代码的人.

    【讨论】:

    • 嗨,我已经在我的问题中清楚地说明了我的问题是什么。如果你不能回答,请离开。我也知道 vs 清楚地告诉。我的问题是为什么它会发生变化,在 var objFieldNames 中我得到了正确的数据类型,在 set(propertyInfos.SetValue(aTSource, dataRow[aField.Name], null)) 如何/为什么它变成双倍,这是我的问题。
    • 这是我一生中收到的最糟糕的回复之一 :-)。
    • 也许您首先要了解问题中的第一句话和您的实际错误消息所说的不同。您的 property 是 int 类型,您的 data 是 double 类型。不适合。您需要转换您的数据。由于我不知道你想如何做到这一点,我只能把这个小练习留给你。
    猜你喜欢
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多