我正在用c#构建一个游戏,它允许你编写自己的关卡,尽管我有点想过。
我有一个名为“World”的基类作为对象。 这是一个简单的:
class World {
但是,当用户编写其关卡时,所有游戏对象都将包含在world对象中。我希望他们能够在以下方面做点什么:
World.ParentObjectName.ParentObjectProperty = "abc";
我知道System.Windows.Forms.Panel
和其他类就像容器一样,可以在其中包含对象并以这种方式访问...我的问题是如何创建一个类似容器的类我可以添加对象,然后使用World.ObjectName
我尝试了class World : System.Collections.CollectionBase
,但是使用这种方法,我必须继续输入World.Item("ObjectName")
有人可以帮忙吗?
谢谢!
答案 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)
设计Form
,Panel
等时,Visual Studio会为您拖动到设计视图中的每个项目生成代码。您可以在 xxx.designer.cs 文件中找到此自动生成的代码。您需要的是Visual Studio的此功能,而不是Form或Panel类。
你必须执行代码生成(如Shadow Wizard所说)来实现同样的目的。否则就不可能,至少在我的知识中。