是否可以向不是类/对象的属性添加方法调用?

时间:2014-03-05 18:09:23

标签: c#

我的班级有一个如下属性:

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"

3 个答案:

答案 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方法的对象