C# 仅通过提供字符串名称获取属性

C# 仅通过提供字符串名称获取属性,c#,reflection,properties,C#,Reflection,Properties,关于这个问题,我想问你几个小时,希望你能帮忙。 给出了以下等级体系: public class Toon { public Skillset skillset; public Toon() { skillset = new Skillset(); } } public class Skillset { public Skill Fight; public Skill Trade; public Skill Talk; public Sk

关于这个问题,我想问你几个小时,希望你能帮忙。 给出了以下等级体系:

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
}
所以

“战斗”,纽顿,30岁;会把Toon.Skillset.Fight设置为30

我希望我能解释得足够清楚,我很感谢大家的意见。我听说反思可以很好地解决这个问题,但我还没有找到答案


PS:仅仅在Toon中获取列表没有帮助,它会破坏语法。

您可以使用反射:

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;
}

但是,这并不是最有效的解决方案。你应该考虑使用<代码>字典<代码>作为你的代码> SkiStase./P>BTW,你的类中有字段,而不是属性。你可以只使用索引器。公共技能此[字符串名称]{get{switch(name){case“Fight”:还击;case“Trade”:还击;case“Talk”:return-Talk;default:return-null;}}}}true,但最终的模型将有大约30个字段,因此我觉得这不合适。关于提供的几个字段,你当然是对的。@LarsTech:啊,是的,谢谢:)@IvanStoev抱歉。我现在已经修好了。