2016-08-26 2 views
3

Ищете часы сейчас по этому конкретному вопросу, надеюсь, вы сможете помочь. Этот класс иерархия Дано:Получение собственности, просто предоставив имя строки

public class Toon 
{ 
public Skillset skillset; 

public Toon() 
{ 

    skillset = new Skillset(); 
} 
} 

public class Skillset 
{ 
    public Skill Fight; 
    public Skill Trade; 
    public Skill Talk; 


    public Skillset() 
    { 
     Fight = new Skill() { name = "Fight", value = 10 }; 
     Trade = new Skill() { name = "Trade", value = 12 }; 
     Talk = new Skill() { name = "Talk", value = 15 }; 
    } 

} 

public class Skill 
{ 
    public string Name; 
    public int Value; 
    public int Rank 

} 

Это должно обеспечить синтаксисе Toon.Skillset.Fight и т.д.

Теперь вопрос: Я хочу, чтобы иметь возможность произвольно увеличить навыки, если они в списке избранных, который является списком.

Так поясню:

public void setSkill(string skillname, Toon toon, int value) 
{ 
    => get property and set it to value 
} 

так что

setSkill ("Борьба", NewToon, 30); будет установлен Toon.Skillset.Fight to 30.

Надеюсь, я мог бы объяснить достаточно ясно, и я благодарен за любой ввод. Я слышал о Reflection, чтобы решить эту проблему красиво, но пока не нашел ответа.

PS: просто получение списка в Toon не поможет, оно разрушает синтаксис.

+4

Кстати, у вас есть поля в классах, а не свойства. – LarsTech

+1

Вы можете просто использовать индекс. общественного Skill это [имя строки] { прибудет { переключателя (имя) { случая "Борьба": возвращение боя; кейс «Торговля»: возвращение Торговля; case "Talk": return Talk; default: null null; } } } –

+0

true, все же окончательная модель будет иметь около 30 полей, поэтому мне это не понравится. С учетом нескольких полей вы, конечно, правы. – Ceron

ответ

1

Вы можете использовать отражение:

public void setSkill(string skillname, Toon toon, int value) 
{ 
    var field = typeof(Skillset).GetField(skillname); 
    var skill = (Skill)field.GetValue(toon.skillset); 

    skill.Value = value; 
} 

Но это не самый исполнительское решения. Вы должны использовать Dictionary<string, Skill> как ваш Skillset.

+0

@IvanStoev Извините. Я исправил это сейчас. – Xiaoy312