2015-07-07 2 views
0

Мой проект имеет следующие структуры:Преобразование денежных свойств объекта

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 из одной валюты в другую. Что такое лучший дизайн решения? использование отражение? еще одна идея?

+3

Почему вы не использовали «массив» или «коллекцию» в первую очередь? –

+0

Не имеет смысла в дизайне! –

+0

Пожалуйста, объясните более подробную информацию о вашем сценарии. Я никогда не видел такого списка переменных, который не может быть решен с помощью коллекции или массива. –

ответ

1

Я бы предложил сделать все эти V полей в массив, как так:

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

Вы можете t курица идти через 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); 
    } 
} 

Редактировать: Вы захотите использовать мое второе предложение Reflection, поскольку ваши переменные не представлены в виде списка.

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 
} 

Suggestion После редактирования

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

Тогда в другой "Co nvert ", вы можете выполнить итерацию через 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}); 
} 
+0

Я отредактировал вопрос, не имеет смысла использовать поля в виде массива. –

+0

@EltonGarcia Еще несколько идей для вас. – MikeH

Смежные вопросы