kee*_*aar 6 c# filehelpers types
我试图加载使用FileHelpers文件(已经喜欢它,除了这一个问题:P)我有CSV文件数据保存到数据库中,所以我使用的是SQLDECIMAL类型来存储的CSV文件中的十进制值.
[FileHelpers.FieldOptional()]
[FileHelpers.FieldConverter(typeof(SqlDecimalConverter))]
public SqlDecimal Rate;
Run Code Online (Sandbox Code Playgroud)
所有这一切都正常,直到我有一个FixRate1的空值.这标记为错误.
"警告异常:空值发现班上场'率'SWTrade’你必须指定一个FieldNullValueAttribute因为这是一个值类型和不可阻挡的为空."
我试图把[FileHelpers.FieldNullValue(SqlDecimal.Null)],但它显然抛出一个错误.
属性参数必须是属性参数类型的常量表达式,typeof表达式或数组创建表达式
即使我在SqlDecimalConverter类中重写FieldToString方法,在读取数据时也不会调用该函数.
那么,在这种情况下,有没有办法可以为Rate数据分配任何空值或甚至其他一些硬编码值,然后我可以用我自己的逻辑中的null direclty替换它?
如果您需要更多详细信息,请告诉我们.提前致谢.
其他评论是正确的你需要使用
private decimal? internalRate;
Run Code Online (Sandbox Code Playgroud)
后来为转换创建了一个属性,实际上该库只自动转换本机类型而SqlDecimal不是一个.
public SqlDecimal? Rate
{
get
{
if (internalRate.HasValue)
return new SqlDecimal(internalRate.Value);
else
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
PS:如果你想转到自定义转换器的方式,用它来读取你需要覆盖方法StringToField(调用FieldToString进行写入)
希望这可以帮助 :)
我从未使用过 FileHelpers,但你可以尝试:
[FileHelpers.FieldNullValue(null)]
public SqlDecimal? Rate;
Run Code Online (Sandbox Code Playgroud)
当然,除了你的其他属性之外。
请注意这里的巨大变化 - 我添加了一个问号以SqlDecimal使其成为可空类型。
然后您可以使用Rate.HasValue来判断它是否为空并Rate.Value访问SqlDecimalifHasValue为 true。
SqlDecimal.Null解析文件后,类似这样的内容将正确使用:
SqlDecimal trueRate = (Rate.HasValue ? Rate.Value : SqlDecimal.Null);
Run Code Online (Sandbox Code Playgroud)
编辑 - 如果您将 Rate 设为可为空 ( SqlDecimal?),您甚至可能不需要“FieldNullValue”属性。再说一次,我对图书馆不熟悉。:(