我的班级有一个如下属性:
public string DueDateAsString
{
get
{
DateTime duedate = this.RigActionType.FrequencyType.GetDueDateForAction(this);
if (this.HasBeenCompleted(duedate))
{
return "Completed";
}
else if (DateTime.Compare(DateTime.Today, duedate) > 0) // past due
{
return duedate.ToString() + " (past due)";
}
return duedate.ToString();
}
}
我想更多地扩展功能,以便这也可以返回类似“n天内到期”的内容,但是我不必创建一个名为VerboseDueDateAsString
的单独属性(或者东西)。
是否可以做这样的事情:
someObject.DueDateAsString; // Outputs "4/1/2014"
someObject.DueDateAsString.Verbose; // Outputs "Due in x days"
答案 0 :(得分:3)
您可以将截止日期公开为属性,并为转换创建扩展方法。将它放在一个静态类中,其名称空间在您需要的位置可见。
public static string Verbose(this DateTime date)
{
return String.Format("Due in {0} days", (DateTime.Now - date).Days);
}
然后将其直接应用到截止日期
Console.WriteLine(someObject.DueDate.Verbose());
如果您使用类似的执行方法替换您的实际财产,您将获得显示截止日期的合理方式
public static string Concise(this DateTime date)
{
// Place the logic of DueDateAsString here
}
Console.WriteLine(someObject.DueDate.Concise());
答案 1 :(得分:1)
DueDateAsString
看起来并不像它应该是一个属性。
struct DueDate {
DateTime date;
bool completed;
public DueDate(DateTime date, bool completed) {
this.date = date;
this.completed = completed;
}
public override string ToString() {
if (this.completed) {
return "Completed";
}
if (DateTime.Compare(DateTime.Today, duedate) > 0) // past due
{
return duedate.ToString() + " (past due)";
}
return duedate.ToString();
}
public string ToVerboseString() {
// Implement this
}
}
⋮
public DueDate DueDate
{
get
{
DateTime duedate = this.RigActionType.FrequencyType.GetDueDateForAction(this);
return new DueDate(duedate, this.HasBeenCompleted(duedate));
}
}
你可以在DateTime
上使用扩展方法,但是仍然需要确定它是否已经完成。
顺便说一下,将其命名为DueDate
以外的其他内容。
答案 2 :(得分:0)
DueDateAsString
需要是一个本身包含Verbose
方法的对象