代码之家  ›  专栏  ›  技术社区  ›  Mike Caron

如何在C#中存储对属性的引用?

  •  3
  • Mike Caron  · 技术社区  · 14 年前

    我正在创建一个游戏,目前正在为它的库存系统工作。我有一个类来代表玩家,它看起来像这样:

    class Player {
        public Weapon WeaponSlot {get;set;}
        public Shield ShieldSlot {get;set;}
        //etc.
    }
    

    class Item {
        //...
    }
    
    class Weapon : Item {
        //...
    }
    

    武器等有子类,但这并不重要。

    无论如何,我正在创建一个UserControl来显示/修改给定清单槽的内容。但是,我不知道该怎么做。在C++中,我会使用类似的东西:

    new InventorySlot(&(player.WeaponSlot));
    

    但是,我不能用C#。

    我找到了TypedReference结构,但这不起作用,因为不允许用这些结构之一创建字段,所以我无法将其存储以供以后在控件中使用。

    反射是唯一的方法,还是有其他我不知道的设施?

    编辑----

    作为参考,以下是我所做的:

    partial class InventorySlot : UserControl {
        PropertyInfo slot;
        object target;
    
        public InventorySlot(object target, string field) {
    
            slot = target.GetType().GetProperty(field);
    
            if (!slot.PropertyType.IsSubclassOf(typeof(Item)) && !slot.PropertyType.Equals(typeof(Item))) throw new //omitted for berevity
    
            this.target = target;
    
            InitializeComponent();
        }
        //...
    }
    

    初始化如下:

    new InventorySlot(player, "WeaponSlot");
    

    另外,关于表现,我并不太在意。这不是一个实时游戏,所以我只需要根据玩家的动作来更新屏幕。:)

    6 回复  |  直到 14 年前
        1
  •  3
  •   Tergiver    14 年前

    实际上,您要创建的是一个属性浏览器。查看Windows窗体 PropertyGrid

    简而言之,就是简单地使用反射。通过存储PropertyDescriptor,您可以获得并设置给定对象实例的属性成员的值。

        2
  •  4
  •   heisenberg    14 年前

    我正在创建一个用户控件 显示/修改给定文件的内容 库存槽。但是,我不确定 会用到像这样的东西

        3
  •  1
  •   marvelous marv    14 年前

    这是afaik的默认行为

        4
  •  0
  •   Brian R. Bondy    14 年前

    class type对象是c#中的引用。值类型声明为 struct

    例如:

    Weapon w1 = new Weapon();
    w2 = w1;//Does not make a copy just makes a second reference to what w1 is pointing to
    

    如果需要函数的输入/输出参数,可以使用 ref out 然后您可以传递它并修改类对象本身。

        5
  •  0
  •   oekstrem    14 年前

    您可以克隆对象以实现所需:

    public class Weapon : ICloneable
    {
        public string Name;
    
        object ICloneable.Clone()
        {
            return this.Clone();
        }
        public Weapon Clone()
        {
            return (Weapon)this.MemberwiseClone();
        }
    }
    

    您可以执行以下操作来获取包含所有内部值的对象的副本:

    Weapon w1 = new Weapon();
    Weapon w2 = w1.Clone()
    
        6
  •  0
  •   leppie    14 年前

    ref .