我的项目有以下结构:
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货币字段从一种货币转换为另一种货币。 什么是最佳解决方案设计?用反射?另一个想法?
答案 0 :(得分:3)
而不是V1
,V2
... 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);
}
}
修改:您需要使用我的第二个建议,即反射,因为您的变量不是列表形式。