ToString()用于类属性?

时间:2009-05-06 11:43:50

标签: c#

假设我有一个“Item”类,它有三个成员变量:string name,decimal quantity和string unit。我有三个公共获取/设置属性。

有时,我想将数量显示为文本以及正确的单位,例如。 10米或100英尺。

我的问题是,是否可以为属性设置某种ToString()函数,以便可以自定义其文本输出?

谢谢,

SAURABH。

7 个答案:

答案 0 :(得分:15)

您可以做的是创建一个返回格式化版本的新(只读)属性:

public string QuantityAsString
{
    get
    {
        return string.Format("{0} {1}", this.Quantity, this.Unit);
    }
}

答案 1 :(得分:9)

听起来你的对象模型没有被正确考虑。您可能想要做的是将UnitQuantity抽象到另一个对象中,然后您可以覆盖ToString。这样做的好处是可以将相关值保持在一起,并允许您实现诸如将来单位之间的转换(例如从最高到英尺等的转换)之类的事情,例如

public struct Measure
{
    public Measure(string unit, decimal quantity)
    {
        this.Unit = unit;
        this.Quantity = quantity;
    }

    public string Unit { get; private set; }
    public decimal Quantity { get; private set; }

    public override string ToString() 
    { 
        return string.Format("{0} {1}", this.Quantity, this.Unit);
    }
}

public class Item
{
    public string Name { get; set; }
    public Measure Measure { get; set; }

    public override string ToString() 
    { 
        return string.Format("{0}: {1}", this.Name, this.Measure);
    }
}

请注意,我在这里创建了Measure结构,因为它可能具有值语义。如果你采用这种方法,你应该使它成为不可变的,并重写Equals / GetHashCode,因为它适用于结构。

答案 2 :(得分:6)

一般来说,将值格式化为适当的单位不是Item类的责任。相反,这应该由一些外部类来完成。

但是,如果你真的想在课堂上进行格式化,我建议您定义一个Unit课程,其implicit conversion operators转换为decimalint s以及所有必需的格式化逻辑。

答案 3 :(得分:2)

我认为从代码质量的角度来看,最好的方法是创建一个用单位包装值并在那里提供.ToString()的类。

答案 4 :(得分:1)

您有两种选择:

  1. 让父类的ToString()自动将这些片段附加到一个漂亮的格式中。
  2. 在类中包装属性并为这些类提供ToString()

答案 5 :(得分:1)

您可以实现IFormatable接口以具有不同的ToString

public class Item : IFormattable
{
    public string Name;
    public decimal Quantity;
    public string Unit;

    public override string ToString(string format, IFormatProvider provider)
    {
        switch(format)
        {
            case "quantity": return Quantity + Unit;
            default: return Name;
        }
    }
}

可以这样使用:

Item item = new Item();
Console.WriteLine(item.ToString());
Console.WriteLine("Quantity: {0:quantity}", item);

答案 6 :(得分:0)

几天前我实施了相同的模型。我为数量和单位制作了单独的课程。它看起来像这样(它是简化的,实际上有构造函数和重载运算符):

class Quantity
{
    public decimal Value;
    public UnitOfMeasure Unit;

    public override string ToString() 
    {
        return string.Format("{0} {1}", Value, Unit); 
    }
}

class UnitOfMeasure
{
    public string Name;

    public override string ToString() { return Name; }
}