【问题标题】:Getting a property just by providing a string name [duplicate]仅通过提供字符串名称来获取属性[重复]
【发布时间】:2017-01-03 07:21:53
【问题描述】:

现在在这个特定问题上寻找几个小时,我希望你能提供帮助。 给出了以下类层次结构:

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 设置为 30。

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

PS:仅仅在 Toon 中获取一个 List 是没有用的,它会破坏语法。

【问题讨论】:

  • 顺便说一句,你的类中有字段,而不是属性。
  • 您可以只使用索引器。 public Skill this[string name] { get { switch (name) { case "Fight": return Fight;案例“贸易”:返回贸易;案例“谈话”:返回谈话;默认值:返回空; } } }
  • 是的,最终模型仍然会有大约 30 个字段,所以我觉得这不太合适。尽管提供了几个字段,但您当然是对的。
  • @LarsTech:啊,是的,谢谢 :)

标签: c# reflection properties


【解决方案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

【讨论】:

  • @IvanStoev 对不起。我现在已经修好了。
猜你喜欢
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
  • 2012-07-08
  • 2013-02-11
  • 1970-01-01
相关资源
最近更新 更多