C#容器类

时间:2010-12-29 11:41:49

标签: c# .net class containers

我正在用c#构建一个游戏,它允许你编写自己的关卡,尽管我有点想过。

我有一个名为“World”的基类作为对象。 这是一个简单的:

class World {

但是,当用户编写其关卡时,所有游戏对象都将包含在world对象中。我希望他们能够在以下方面做点什么:

World.ParentObjectName.ParentObjectProperty = "abc";

我知道System.Windows.Forms.Panel和其他类就像容器一样,可以在其中包含对象并以这种方式访问​​...我的问题是如何创建一个类似容器的类我可以添加对象,然后使用World.ObjectName

访问它们

我尝试了class World : System.Collections.CollectionBase,但是使用这种方法,我必须继续输入World.Item("ObjectName")

有人可以帮忙吗?

谢谢!

5 个答案:

答案 0 :(得分:4)

你能做的最好就是像这样添加indexer

public string this[string name]
{
    get
    {
        return this.Item(name);
    }
}

假设Item()已经有效,请按以下方式调用:

string value = world["ObjectName"];

答案 1 :(得分:1)

不幸的是,System.Windows.Forms.Panel实际上无法做到这一点,你也不会。关于Windows窗体的情况,会发生的是在从Panel派生的类上自动生成相应的属性。这意味着通过设计器添加的控件确实会有命名属性;但是,这是基于设计/编译时可用的信息。请注意,如果在Windows窗体应用程序中动态添加控件AT RUNTIME,则Panel对象上不会出现相应的属性(尽管可以通过常规收集接口访问它们)。这种自动生成的访问器可能会给人一种关于Panel的特殊情况的印象,但确实没有。

答案 2 :(得分:0)

您需要向World类添加公共属性。这些公共属性公开该类的私有字段,以便您可以从类本身之外的代码中设置它们。

例如,您的World可能如下所示:

class World
{
    private string _ObjectName;

    public string ObjectName
    {
        get 
        {
           return _ObjectName; 
        }
        set 
        {
           _ObjectName= value; 
        }
    }
}

然后你可以编写如下代码:

World myWorld = new World();
myWorld.ObjectName = "Home World";


有关详细信息,请阅读this tutorial,了解如何向C#中的类添加属性,以及最近更新的C# Programming Guide相关属性。

答案 3 :(得分:0)

首先,在System.Windows.Forms.Panel中,System.Windows.Forms部分只是命名空间,Panel是类。

如果您在世界级中将类声明为static,则会出现另一种获取您建议的模式中显示的对象的方法。

class World
        {
            public static class ParentObject
            {
                public static int memberX;
            }
        }

然后您可以直接将它们与类名一起使用

 World.ParentObject.memberX = 10;

但是,我仍然不认为这对你来说是一个可行的解决方案。

答案 4 :(得分:0)

设计FormPanel等时,Visual Studio会为您拖动到设计视图中的每个项目生成代码。您可以在 xxx.designer.cs 文件中找到此自动生成的代码。您需要的是Visual Studio的此功能,而不是Form或Panel类。

你必须执行代码生成(如Shadow Wizard所说)来实现同样的目的。否则就不可能,至少在我的知识中。