gpt4 book ai didi

c# - 如何在 C# 中将 [TYPE] 转换为 nullable<[TYPE]>?

转载 作者:太空狗 更新时间:2023-10-29 23:33:18 25 4
gpt4 key购买 nike

问题:

我编写了一个方法来检索 SQL 结果作为类列表而不是数据表。问题是,我在数据库中有一个可以为 null 的 int 字段。

如果我用 NULL 命中一行int , DataReader返回 DbNull.Value而不是空。所以System.Convert.ChangeType(objVal, fi.FieldType)抛出异常,因为它无法转换 DbNullint .

到目前为止还很糟糕。我以为我已经解决了问题,当我刚刚比较objValDbNull.Value如果为真,则改为这样做: System.Convert.ChangeType(null, fi.FieldType)

不幸的是,我刚刚意识到,生成的整数类型是 0 而不是 NULL。

所以我只是尝试将类中的 int 类型更改为 Nullable<int> , 但现在我遇到的问题是,当值不是 DbNull.Value 时, ChangeType抛出异常,因为它无法转换 intnullable<int> ...

所以现在我尝试检测 datareader 返回的对象的类型,并将其转换为可为 null 的值。

tTypeForNullable正确显示为 Nullable<int> .但是当我查看结果类型时,我得到:int .

这是为什么呢?更重要的是:我怎样才能正确地做到这一点?

请注意,因为类型是一个对象,所以我不能使用泛型方法来创建 Nullable<int> .

bool bisnull = IsNullable(objVal);
bool bisnullt = IsNullable(fi.FieldType);

if (bisnullt)
{
Type tTypeForNullable = typeof(Nullable<>).MakeGenericType(objVal.GetType());

//object result = Activator.CreateInstance(tTypeForNullable, new object[] { objVal });
//object result = Activator.CreateInstance(typeof(Nullable<int>), new object[] { objVal });
object result = Activator.CreateInstance(tTypeForNullable, objVal);
Type tres = result.GetType();
fi.SetValue(tThisValue, System.Convert.ChangeType(result, fi.FieldType));
}

完整的例程供引用:

public virtual System.Collections.Generic.IList<T> GetList<T>(System.Data.IDbCommand cmd)
{
System.Collections.Generic.List<T> lsReturnValue = new System.Collections.Generic.List<T>();
T tThisValue = default(T);
Type t = typeof(T);

lock (cmd)
{
using (System.Data.IDataReader idr = ExecuteReader(cmd))
{

lock (idr)
{

while (idr.Read())
{
//idr.GetOrdinal("")
tThisValue = Activator.CreateInstance<T>();

// Console.WriteLine(idr.FieldCount);
for (int i = 0; i < idr.FieldCount; ++i)
{
string strName = idr.GetName(i);
object objVal = idr.GetValue(i);


System.Reflection.FieldInfo fi = t.GetField(strName);
//Type tttttt = fi.FieldType;
if (fi != null)
{
//fi.SetValue(tThisValue, System.Convert.ChangeType(objVal, fi.FieldType));
if (objVal == System.DBNull.Value)
{
objVal = null;
fi.SetValue(tThisValue, null);
}
else
{
//System.ComponentModel.TypeConverter conv = System.ComponentModel.TypeDescriptor.GetConverter(fi.FieldType);

bool bisnull = IsNullable(objVal);
bool bisnullt = IsNullable(fi.FieldType);

if (bisnullt)
{
Type tTypeForNullable = typeof(Nullable<>).MakeGenericType(objVal.GetType());

//object result = Activator.CreateInstance(tTypeForNullable, new object[] { objVal });
//object result = Activator.CreateInstance(typeof(Nullable<int>), new object[] { objVal });
object result = Activator.CreateInstance(tTypeForNullable, objVal);
Type tres = result.GetType();
fi.SetValue(tThisValue, System.Convert.ChangeType(result, fi.FieldType));
}
fi.SetValue(tThisValue, System.Convert.ChangeType(objVal, fi.FieldType));
}
}
else
{
System.Reflection.PropertyInfo pi = t.GetProperty(strName);
if (pi != null)
{
//pi.SetValue(tThisValue, System.Convert.ChangeType(objVal, pi.PropertyType), null);


if (objVal == System.DBNull.Value)
{
objVal = null;
pi.SetValue(tThisValue, null, null);
}
else
{
pi.SetValue(tThisValue, System.Convert.ChangeType(objVal, pi.PropertyType), null);
}


}
// Else silently ignore value
} // End else of if (fi != null)

//Console.WriteLine(strName);
} // Next i

lsReturnValue.Add(tThisValue);
} // Whend

idr.Close();
} // End Lock idr

} // End Using idr

} // End lock cmd

return lsReturnValue;
} // End Function GetList

用这个:

public System.Data.IDataReader ExecuteReader(System.Data.IDbCommand cmd)
{
System.Data.IDataReader idr = null;

lock(cmd)
{
System.Data.IDbConnection idbc = GetConnection();
cmd.Connection = idbc;

if (cmd.Connection.State != System.Data.ConnectionState.Open)
cmd.Connection.Open();

idr = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
} // End Lock cmd

return idr;
} // End Function ExecuteReader

请注意,因为类型是一个对象,所以我不能使用泛型方法来创建 Nullable<int> .

最佳答案

您正在装箱 - 可空值类型的装箱操作的结果绝不是该类型的装箱值。它可以是 null 或不可为 null 的值类型。参见 MSDN获取更多信息。

关于c# - 如何在 C# 中将 [TYPE] 转换为 nullable<[TYPE]>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11031315/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com