C# C从字符串中获取属性名

C# C从字符串中获取属性名,c#,string,attributes,C#,String,Attributes,我正在创建一个C控制台应用程序游戏,其中包括管理角色及其库存。我有各种各样的物品,玩家可以储存在他的库存中。有一件东西特别给我带来麻烦,那就是药水。它是一个玩家使用的物品,可以提升他的一个属性,即生命值或魔法值。但是上升的属性由药剂类的字符串属性表示 这是我的代码: 代表游戏角色的玩家类 公开课选手 { //球员的统计数据 公共int HP; 公共int MP; 公共综合实力; 公共防卫; public void useItem//参数是要使用的项目。我的情况下是药剂 { //药剂必须提升属性加

我正在创建一个C控制台应用程序游戏,其中包括管理角色及其库存。我有各种各样的物品,玩家可以储存在他的库存中。有一件东西特别给我带来麻烦,那就是药水。它是一个玩家使用的物品,可以提升他的一个属性,即生命值或魔法值。但是上升的属性由药剂类的字符串属性表示

这是我的代码:

代表游戏角色的玩家类

公开课选手 { //球员的统计数据 公共int HP; 公共int MP; 公共综合实力; 公共防卫; public void useItem//参数是要使用的项目。我的情况下是药剂 { //药剂必须提升属性加值类型中指定的属性值 } } 药剂类继承自的物品类:

公共类项目 { 公共字符串名称;//项的名称 public int Bonus;//物品给予玩家的属性加值 } 最后是药水课:

公共类药剂:物品 { 公共字符串BonusType;//表示药剂提升了哪个属性 } 我的问题是:
我应该在玩家类的UseItem方法中写些什么来获取所用药剂的属性BonuType,从而根据它提升正确的属性?

你需要知道你使用的是哪种物品,在C 6中:

public void UseItem(Item item) 
{
    switch(item)
    {
       case Potion potion:
           if(potion.BonusType == "Whatever")
           {
               //do your stuff
           }
           break;
    }
}
然而,正如@Neijwiert所提到的。。。这不是很好的设计,因为你对球员负有全部责任。。。最好是:

public class Player
{
    //Stats of the player
    public int HP { get; set; }
    public int MP { get; set; }
    public int Strength { get; set; }
    public int Defence { get; set; }

    public void UseItem(Item item) //The parameter is the Item to be used. A potion in my case
    {
        item.Use(this);
    }
}


public abstract class Item
{
    public string Name { get; set;} //Name of the item

    public abstract void Use(Player player);

}

public enum BonusType
{
    HP,
    MP,
    Strength,
    Defence
}

public class Potion : Item
{
    public BonusType BonusType { get; set; }
    public int Amount { get; set; }

    public override void Use(Player player)
    {
        switch (BonusType)
        {
            case BonusType.HP:
                player.HP += Amount;
                break;
            case BonusType.MP:
                player.MP += Amount;
                break;
            case BonusType.Strength:
                player.Strength += Amount;
                break;
            case BonusType.Defence:
                player.Defence += Amount;
                break;
            default:
                throw new ArgumentOutOfRangeException();
        }
    }
}

现在,你可以拥有一整套物品来操纵玩家并产生各种效果,而这些效果是由物品而不是玩家来管理的。

为什么不从简单的施法开始呢

如果物品是药水 { var药水=药水项目; Console.WriteLinepotion.BonuType; } 在较新版本的SIF c中,可以将检查与强制转换合并

如果物品是药水 { Console.WriteLinepotion.BonuType; } 或者,使用带有类型检查的switch语句

开关项 { 案例药水: Console.WriteLinepotion.BonuType; 打破 } 简单的方法:

公共无效UseItem { switchitem.BonusType 案例健康奖励://字符串BonuType之一 player.HP=player.HP+奖金; 打破 case://字符串BonuType中的一个 player.HP=player.MP+奖金; 打破 违约: //如果没有匹配。 打破 } }
我想试试你的游戏

您可以进行反射,但这似乎是一个X/Y问题。考虑在一个带玩家的药剂中添加一个委托。或者是一个虚拟方法,它将玩家作为参数。使用Item.ActivatePlayer player或类似工具的东西不应该是Item类的属性吗?将其转过来。您正在执行:Player->UseItemitem=>基于item.Props更改玩家道具。-换一种方式:Player->UseItemitem=>item.Applyplayer=>item根据其item.Props更改Player.Props,从而知道哪些是Player.Props。访问者模式您甚至可以使用主机和访问者的专用接口使其更加复杂。