我想把一个常数日期时间在一个属性参数,我如何使一个常数日期时间?它与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上什么都不做。