转换对象的货币属性

时间:2015-07-07 20:45:06

标签: c#

我的项目有以下结构:

public struct Money
{
    public CurrencyCodes Currency;
    public decimal Amount;
}

public class Foo
{
    public Money AdultFare { get; set; }
    public Money ChildFare { get; set; }
    public Money BabyFare { get; set; }
    public Money AdultFee { get; set; }
    public Money ChildFee { get; set; }
    public Money BabyFee { get; set; }
    public Money TotalFare { get; set; }
    public Money TotalFee { get; set; }
}

现在我需要将所有Foo货币字段从一种货币转换为另一种货币。 什么是最佳解决方案设计?用反射?另一个想法?

2 个答案:

答案 0 :(得分:3)

而不是V1V2 ... V10创建一个列表:

List<Money> V = new List<Money>();
V.Add (new Money()); //repeat 10 times

然后你可以迭代:

foreach (Money m in V)
{
  //Do your conversion
}

修改后的建议

List<Money> AllMoneyFields = new List<Money>();
public Foo()
{
  AllMoneyFields = new List<Money>
    {AdultFare,ChildFare,BabyFare,AdultFee,ChildFee,BabyFee,TotalFare,TotalFee};
}

然后在另一个“转换”方法中,您可以遍历AllMoneyFields

建议3

如果您想保护未来的Money媒体资源,请使用enum来描述该媒体资源:

//Add a field to Money: public MoneyDescription Description;
enum MoneyDescription
{
  AdultFare,
  AdultFee,
  ....
  TotalFee
} 

List<Money> V = new List<Money>();
foreach (MoneyDescription md in Enum.GetValues(typeof(MoneyDescription)))
{
  V.Add(new Money() {Description = md});
}

答案 1 :(得分:1)

我建议将所有这些V字段组成一个数组,如下所示:

public class Foo
{
    public Money[] V { get; set; } // instantiate as "new Money[10]"
}

然后,您可以浏览V数组并轻松转换每个数组,如下所示:

// in class Foo
public void ConvertAllMoney(CurrencyCodes newCurrency)
{
    foreach (Money m in V)
        m = m.ConvertTo(newCurrency);
}

或者,如果您不想制作数组,实际上您可以使用反射,如您所知:

// in class Foo
public void ConvertAllMoney(CurrencyCodes newCurrency)
{
    foreach (var p in typeof(Foo).GetProperties().Where(prop => prop.PropertyType == typeof(Money)))
    {
        Money m = (Money)p.GetValue(this, null);
        p.SetValue(this, m.ConvertTo(newCurrency), null);
    }
}

修改:您需要使用我的第二个建议,即反射,因为您的变量不是列表形式。