如何将DateTime.Today作为FileHelpers中的FieldNullValue返回

时间:2015-05-15 11:15:16

标签: c# datetime filehelpers

我正在尝试将FieldNullValue类中的DateTime变量的FileHelpers设置为Today值(因此,如果我读取.csv时没有条目,那么默认为今天的日期)。我试过的代码是:

[FieldOptional]
[FieldNullValue(DateTime.Today)]
public DateTime DATE;

但是我收到了错误

  

“错误1属性参数必须是常量表达式,typeof   表达式或数组创建表达式的属性参数   型”。

请有人解释我做错了吗?

3 个答案:

答案 0 :(得分:2)

显而易见的方法是

[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;

答案 1 :(得分:0)

DateTime.Today不是常量值,对于日期时间值,您必须使用类型操作符,如下所示,此处您还必须指定固定日期,即常量值

[FieldNullValue(typeof(DateTime), "2005-1-1")]

或第二种方法可以将DATE声明为可空类型

public DateTime? DATE;

稍后为转化创建一个属性

public DateTime? DATE     {
   get 
    {
    if (DATE.HasValue)
        return DATE;
    else
        return DateTime.Today;
    }
}

答案 2 :(得分:0)

ConnectingKamlesh的答案是正确的,尽管他的例子混淆了事情,因为他将该属性命名为与该字段相同。

是的,您的问题与变量有关,但您所做的是将变量作为属性的私有/支持字段。由于默认情况下FileHelpers仅使用字段而不使用属性,因此您将加载到私有字段中,但访问为您进行转换的属性。

在下面的示例中,我们有一个系统只使用没有小数位的整数值,因为它隐含在字符串形式中,第一个(或最后一个)数字带有alpha。

因此,要使用正确使用的正确小数位数来获得正确的格式,请使用以下代码:

    [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的额外步骤(这是我自己的转换代码),但是你知道属性必须使用它们所反对的属性/字段/类之外的静态值。