2016-08-26 1 views
3

を提供するだけでプロパティを取得すると、私はあなたが助けてくれることを願っています。 次のクラスhierachyが与えられます。この特定の質問で今何時間も探している文字列名

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などの構文を提供することである

質問:私は、彼らがしている場合は、ランダムに、スキルを向上させることができるようにしたい リストであるお気に入りリストに表示されます。だから、basicly

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

よう

setSkillは( "ファイト"、NewToon、30); Toon.Skillset.Fightを30に設定します。

私は十分に説明できると思いますが、私はどんな入力にも感謝しています。この問題をうまく解決するためにReflectionを聞いたことがありますが、まだ答えは見つかりませんでした。

PS:Toonのリストを取得するだけでは助けにならず、構文が破棄されます。

+4

ところで、クラスにはプロパティがありません。 – LarsTech

+1

あなたはインデクサーを使うことができます。 公共スキルこの[列名] { のget { スイッチ(名) { ケース "ファイト": リターンファイト。 ケース "貿易": 返品貿易; ケース「トーク」: return talk; デフォルト: 戻り値null; } } } –

+0

でも、最終的なモデルには約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; 
} 

をしかし、これは最もパフォーマンスソリューションではありません。 SkillsetとしてDictionary<string, Skill>を使用することを検討する必要があります。

+0

@IvanStoev申し訳ありません。私は今それを修正しました。 – Xiaoy312

関連する問題