gpt4 book ai didi

c# - 如何将空值分配给动态属性类型

转载 作者:行者123 更新时间:2023-12-02 17:24:54 25 4
gpt4 key购买 nike

基本上,我需要一个将 DataReader 对象转换为泛型类型的转换器。

所以当我这样做时 -

while(dataReader.HasRows()){
var result= dataReader.ConvertToObject<MyModel>();
}

它调用泛型类型的扩展方法 -

public static T ConvertToObject<T>(this DbDataReader reader) where T : new()
{
T res = new T();

T t = new T();

for (int inc = 0; inc < reader.FieldCount; inc++)
{
Type type = t.GetType();
PropertyInfo prop = type.GetProperty(reader.GetName(inc));
var value = reader.GetValue(inc);
if (value == System.DBNull.Value)
{
value = null;
}

var targetType = IsNullableType(prop.PropertyType) ? Nullable.GetUnderlyingType(prop.PropertyType) : prop.PropertyType;

value = Convert.ChangeType(value, targetType);

prop.SetValue(t, value, null);
}

res = t;
return res;
}

private static bool IsNullableType(Type type)
{
return type.IsConstructedGenericType && type.GetGenericTypeDefinition().Equals(typeof(Nullable<>));
}

它工作正常,直到datareader中的结果是System.DBNull,除了System.String

为了处理空值,我强制检查该值是否为 System.DBNull 类型,然后为其分配一个 C# NULL 对象。

if (value == System.DBNull.Value)
{
value = null;
}

但是,当数字类型对象的结果为 null 时,转换会失败。

所以基本上我想做的是当结果值是类型 - System.Nullable[System.Decimal]

然后

if (value == System.DBNull.Value)
{
value = (System.Decimal?) null;
}

或者

value = (System.DateTime?)null //for DateTime
value = (System.Int32?)null //for Int32

我试图获取动态属性类型

if (value == System.DBNull.Value)
{
value = (prop.PropertyType ?) null; // to get it dynamic
}

这不起作用。请让我知道我必须做什么?

最佳答案

您不能将 null 指定为 T 类型的值,因为它可能不是 T 的有效值。 (想想int等)

但是,您可以使用 default(T),这将是 T 的默认值 - 与保留 type 字段时获得的值相同例如,T 未初始化。那将是:

  • 对于引用类型,空文字
  • 对于可为 null 的值类型,该类型的 null 值
  • 对于不可为 null 的值类型,“全零”值(0 表示所有数值等)

关于c# - 如何将空值分配给动态属性类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46109399/

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