如何 return DateTime.Today 作为 FileHelpers 中的 FieldNullValue
How to return DateTime.Today as a FieldNullValue in FileHelpers
我正在尝试将 FileHelpers
class 中的 DateTime
变量的 FieldNullValue
设置为今天的值(所以如果当我阅读 .csv没有条目,它默认为今天的日期)。我试过的代码是:
[FieldOptional]
[FieldNullValue(DateTime.Today)]
public DateTime DATE;
但是我收到错误
"Error 1 An attribute argument must be a constant expression, typeof
expression or array creation expression of an attribute parameter
type".
有人能解释一下我做错了什么吗?
显而易见的方法是
[FieldOptional]
[FieldNullValue(typeof(DateTime), DateTime.Today.ToString("M-dd-yyyy"))]
public DateTime DATE;
但似乎 FieldNullValueAttribute 无法像 DateTime.Today.ToString() 那样评估表达式,所以唯一适合你的方法是将固定日期硬编码为字符串(不是我们在代码中想要的):
[FieldOptional]
[FieldNullValue(typeof(DateTime), "5/15/2015")]
public DateTime DATE;
DateTime.Today 不是常量值,对于日期时间值,您必须使用如下所示的 typeof 运算符,在这里您必须再次指定固定日期,即常量值
[FieldNullValue(typeof(DateTime), "2005-1-1")]
或者第二种方法可以是将 DATE 声明为可空类型
public DateTime? DATE;
然后为转换创建一个属性
public DateTime? DATE {
get
{
if (DATE.HasValue)
return DATE;
else
return DateTime.Today;
}
}
ConnectingKamlesh 的回答是正确的,尽管他的示例混淆了事物,因为他将 属性 命名为与字段相同。
是的,您的问题与变量有关,但您所做的是将变量作为 private/backing 字段提供给 属性。由于默认情况下 FileHelpers 仅使用字段而不使用属性,因此您加载到私有字段但访问 属性 为您进行转换。
在我下面的例子中,我们有一个系统只使用没有小数位的整数值,因为它以字符串形式暗示,第一个(或最后一个)数字是字母。
因此,为了获得可以正确使用的具有正确小数位数的正确格式,我使用以下代码:
[FieldOrder(59),FieldAlign(AlignMode.Right, '0'),
FieldConverter(typeof(SynergyHelper.DecimalConverter)),
FieldFixedLength(5)]
private Nullable<System.Int32 > m_CLOYAL;
public Nullable<System.Decimal > CLOYAL
{
get
{
if (m_CLOYAL.HasValue)
return (System.Decimal)((System.Double)m_CLOYAL / Math.Pow(10, 2));
return null;
}
set
{
m_CLOYAL = (System.Int32)(((System.Double)value.GetValueOrDefault()) *
Math.Pow(10, 2));
}
}
所以你可以看到支持字段,你无法触及,但 属性 是可用的。对我来说,我也经历了 DecimalConverter 的额外步骤(这是我自己的转换代码),但如您所知,属性必须使用它们反对的 property/field/class 之外的静态值。
我正在尝试将 FileHelpers
class 中的 DateTime
变量的 FieldNullValue
设置为今天的值(所以如果当我阅读 .csv没有条目,它默认为今天的日期)。我试过的代码是:
[FieldOptional]
[FieldNullValue(DateTime.Today)]
public DateTime DATE;
但是我收到错误
"Error 1 An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type".
有人能解释一下我做错了什么吗?
显而易见的方法是
[FieldOptional]
[FieldNullValue(typeof(DateTime), DateTime.Today.ToString("M-dd-yyyy"))]
public DateTime DATE;
但似乎 FieldNullValueAttribute 无法像 DateTime.Today.ToString() 那样评估表达式,所以唯一适合你的方法是将固定日期硬编码为字符串(不是我们在代码中想要的):
[FieldOptional]
[FieldNullValue(typeof(DateTime), "5/15/2015")]
public DateTime DATE;
DateTime.Today 不是常量值,对于日期时间值,您必须使用如下所示的 typeof 运算符,在这里您必须再次指定固定日期,即常量值
[FieldNullValue(typeof(DateTime), "2005-1-1")]
或者第二种方法可以是将 DATE 声明为可空类型
public DateTime? DATE;
然后为转换创建一个属性
public DateTime? DATE {
get
{
if (DATE.HasValue)
return DATE;
else
return DateTime.Today;
}
}
ConnectingKamlesh 的回答是正确的,尽管他的示例混淆了事物,因为他将 属性 命名为与字段相同。
是的,您的问题与变量有关,但您所做的是将变量作为 private/backing 字段提供给 属性。由于默认情况下 FileHelpers 仅使用字段而不使用属性,因此您加载到私有字段但访问 属性 为您进行转换。
在我下面的例子中,我们有一个系统只使用没有小数位的整数值,因为它以字符串形式暗示,第一个(或最后一个)数字是字母。
因此,为了获得可以正确使用的具有正确小数位数的正确格式,我使用以下代码:
[FieldOrder(59),FieldAlign(AlignMode.Right, '0'),
FieldConverter(typeof(SynergyHelper.DecimalConverter)),
FieldFixedLength(5)]
private Nullable<System.Int32 > m_CLOYAL;
public Nullable<System.Decimal > CLOYAL
{
get
{
if (m_CLOYAL.HasValue)
return (System.Decimal)((System.Double)m_CLOYAL / Math.Pow(10, 2));
return null;
}
set
{
m_CLOYAL = (System.Int32)(((System.Double)value.GetValueOrDefault()) *
Math.Pow(10, 2));
}
}
所以你可以看到支持字段,你无法触及,但 属性 是可用的。对我来说,我也经历了 DecimalConverter 的额外步骤(这是我自己的转换代码),但如您所知,属性必须使用它们反对的 property/field/class 之外的静态值。