ToString()用于类属性?

vir*_*mic 9 c#

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

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

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

谢谢,

SAURABH.

Fre*_*örk 15

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

public string QuantityAsString
{
    get
    {
        return string.Format("{0} {1}", this.Quantity, this.Unit);
    }
}
Run Code Online (Sandbox Code Playgroud)


Gre*_*ech 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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


Ant*_*lev 6

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

但是,如果你真的想在类中进行格式化,我建议Unit使用隐式转换运算符定义一个类来转换为decimal或者ints以及所有必需的格式化逻辑.

  • 如果希望保持任何对象的文本描述的格式和顺序在UI层之间保持一致,那么将格式化逻辑放在域层中是完全正确的. (2认同)