假设我有一个“Item”类,它有三个成员变量:string name,decimal quantity和string unit。我有三个公共获取/设置属性。
有时,我想将数量显示为文本以及正确的单位,例如。 10米或100英尺。
我的问题是,是否可以为属性设置某种ToString()函数,以便可以自定义其文本输出?
谢谢,
SAURABH。
答案 0 :(得分:15)
您可以做的是创建一个返回格式化版本的新(只读)属性:
public string QuantityAsString
{
get
{
return string.Format("{0} {1}", this.Quantity, this.Unit);
}
}
答案 1 :(得分:9)
听起来你的对象模型没有被正确考虑。您可能想要做的是将Unit
和Quantity
抽象到另一个对象中,然后您可以覆盖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转换为decimal
或int
s以及所有必需的格式化逻辑。
答案 3 :(得分:2)
我认为从代码质量的角度来看,最好的方法是创建一个用单位包装值并在那里提供.ToString()
的类。
答案 4 :(得分:1)
您有两种选择:
答案 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; }
}