c#中的常量日期时间



我想把一个常数日期时间在一个属性参数,我如何使一个常数日期时间?它与EntLib验证应用程序块的ValidationAttribute相关,但也适用于其他属性。

当我这样做时:

private DateTime _lowerbound = new DateTime(2011, 1, 1);
[DateTimeRangeValidator(_lowerbound)]

我会:

An object reference is required for the non-static field, method, or property _lowerbound

通过这样做

private const DateTime _lowerbound = new DateTime(2011, 1, 1);
[DateTimeRangeValidator(_lowerbound)]

我会:

类型为"System"。不能声明DateTime

任何想法?这样做是不可取的:

[DateTimeRangeValidator("01-01-2011")]

正如之前的一些回复所指出的,c#本身不支持const DateTime,不能用作属性参数。尽管如此,readonly DateTime(在Effective c#,第2版[Item 2]中推荐const)是用于以下其他情况的简单解决方案:

public class MyClass
{
    public static readonly DateTime DefaultDate = new DateTime(1900,1,1);
}

我一直读到的解决方案是要么走字符串的路线,要么将日/月/年作为三个单独的参数传递,因为c#目前不支持DateTime文字值。

下面是一个简单的示例,它允许您将三个int类型的参数或一个string类型的参数传递到属性中:

public class SomeDateTimeAttribute : Attribute
{
    private DateTime _date;
    public SomeDateTimeAttribute(int year, int month, int day)
    {
        _date = new DateTime(year, month, day);
    }
    public SomeDateTimeAttribute(string date)
    {
        _date = DateTime.Parse(date);
    }
    public DateTime Date
    {
        get { return _date; }
    }
    public bool IsAfterToday()
    {
        return this.Date > DateTime.Today;
    }
}

DateTimeRangeValidator可以接受字符串表示(ISO8601格式)作为参数

                            LowerBound              UpperBound
[DateTimeRangeValidator("2010-01-01T00:00:00",  "2010-01-20T00:00:00")]

单个参数将被解释为UpperBound,因此如果您想输入LowerBound,则需要2。查看文档,看看UpperBound是否有一个特殊的'do not care'值,或者你是否需要将其设置为一个非常遥远的未来日期。

哎呀,重读一下就注意到了

"这样做是不可取的"

[DateTimeRangeValidator("01-01-2011")]

为什么不呢?

private const string LowerBound = "2010-01-01T00:00:00";
private const string UpperBound = "2010-01-20T00:00:00";
[DateTimeRangeValidator(LowerBound, UpperBound)]

比(VB日期文字格式)

更差/不同
private const DateTime LowerBound = #01/01/2000 00:00 AM#;
private const DateTime UpperBound = #20/01/2000 11:59 PM#;
[DateTimeRangeValidator(LowerBound, UpperBound)]

hth,
艾伦。

DateTime类型在c#中永远不能是常量

编写如下方法:

private static DateTime? ToDateTime(string value)
    {
        if (string.IsNullOrWhiteSpace(value))
        {
            return null;
        }
        return DateTime.ParseExact(value, "dd-MM-yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None);
    }

现在你可以像这样在datarow中使用字符串:(空,"28 - 02 - 2021","01 - 03 - 2021",3)]

老问题,但这里有另一个解决方案:

 public DateTime SOME_DATE
 {
      get
      {
           return new Date(2020, 04, 03);
      }
      set
      {
           throw new ReadOnlyException();
      }
 }

这个解决方案的主要优点是它允许您将日期存储在DateTime中,而不必使用字符串。如果你想,你也可以不抛出任何异常,在set上什么都不做。

相关内容

  • 没有找到相关文章

最新更新