“System.Int16”类型的对象无法转换为“System.Nullable”1 [System.Int32]类型

时间:2018-06-13 16:38:24

标签: c# nullable system.reflection datareader

我有一个从数据读取器的数据生成类类型列表的方法。

   if (datareader != null && datareader .HasRows)
   {

                Dictionary<string, PropertyInfo> pDict= GetPropertyDictionary<T>();
                var fields = GetFieldNames(datareader );
                while (datareader .Read())
                {
                    T myobj= new T();
                    for (int index = 0; index < fields.Count; index++)
                    {                        
                        if (pDict.TryGetValue(fields[index], out PropertyInfo info))
                        {

                                var val1 = datareader .GetValue(index);                                
                                info.SetValue(myobj, (val1 == DBNull.Value) ? null : val1, null);

                        }
                    }

                }

            }

我有类属性,其中一些可以为空。

public string StudentName{ get; set; }
public decimal? percentage{ get; set; }
public int? StudentNumber{ get; set; }

代码适用于除StudentNumber之外的所有属性,即<。p>

在上面的代码行抛出exeption 类型'System.Int16'的对象无法转换为'System.Nullable`1 [System.Int32] 类型:

  

info.SetValue(myobj,(val1 == DBNull.Value)?null:val1,null);

可以采取哪些措施来解决这个问题?

3 个答案:

答案 0 :(得分:1)

我不同意此代码有很多原因,但要解决您当前的问题并回答您的问题,因为您无法将Int16明确转换为{{1} }也不是Int32Nullable<Int32>

要实现此目的,您需要先将值转换为int?,然后转换为Int32

有更好的方法,但要明确发生了什么,并在这里解决这个错误......

Nullable<Int3>

答案 1 :(得分:1)

您在这里遇到的问题是,虽然您可以将short投射到int,但您无法将short加载到int直接即,

object box = (short)5;
var x = (int?)box; // Invalid cast.
var y = (int?)(short?)box; // fine, we cast to short and then to int.

您可以将班级的媒体资源类型更改为short?,或者您可以检查您的媒体资源类型是否为Nullable<int32>,并对该情况下的值使用Convert.ToInt32

答案 2 :(得分:0)

尝试更改类型:

var val1 = datareader.GetValue(index);    
var convertedValue = (val1 == DBNull.Value) ? null : Convert.ChangeType(val1, info.PropertyType);                            
info.SetValue(myobj, convertedValue, null);