如何使用变量作为类名构造对象?

时间:2016-10-30 20:35:43

标签: c# .net class oop constructor

我正在用C#Windows形式创建一个游戏,我将在游戏中有9个不同的角色供玩家选择(使用单选按钮)。我有一个名为PlayerChar的变量。每当玩家选择一个角色时,我会将角色的名字存储在该变量中。另外,每个角色我有9个不同的班级。我想要做的是,让程序从所选字符的类中创建一个对象。但我不知道如何使用变量PlayerChar作为我的班级名称。

PlayerChar obj = new PlayerChar();

这基本上就是我想要做的。我也尝试使用Activator.CreateInstance:

PlayerChar myObj = Activator.CreateInstance(PlayerChar);

4 个答案:

答案 0 :(得分:2)

你正在以错误的方式解决问题。你不需要从一个类名变量创建播放器;变量可以是任何东西,你只需要将它与构造正确类的对象的方法相匹配。这是使用某种工厂完成的。

例如,这是一个从字符串创建Player个实例的迷你工厂:

Player CreatePlayerInstance(string type)
{
    var creatorMap = new Dictionary<string, Func<Player>>() {
        { "foo", () => new FooPlayer() },
        { "bar", () => new BarPlayer() },
    };

    return creatorMap[type]();
}

显然没有错误检查或任何事情,但这是核心思想。您可以通过多种方式扩展和修改它,具体取决于您的目标。

答案 1 :(得分:1)

试试这个

initrd

答案 2 :(得分:1)

PlayerChar成为所有角色类的基类。

public class PlayerChar
{
    ...
}

public class WarriorChar : PlayerChar
{
    ...
}

public class RangerChar : PlayerChar
{
    ...
}

public class ClericChar : PlayerChar
{
    ...
}

然后使用开关块或顺序if块来使用正确的字符子类实例化播放器对象。

PlayerChar myObj = null;

if (warriorButton.IsSelected)
    myObj = new WarriorChar();
else if (rangerButtom.IsChecked)
    myObj = new RangerChar();
else if (clericButton.IsChecked)
    myObj = new ClericChar();
...

(不要使用Activator类来实例化你的对象,除非你完全理解Activator做了什么,并且有充分考虑使用它的原因。十分之九它被那些试图使用他们的代码的人所使用,最终只会使事情过于复杂。)

答案 3 :(得分:-2)

选项1

创建两个全局变量来存储您的信息。然后使用if语句来分配不同的字符和类。

选项2

创建一系列方法来使用表单中的全局变量来操作和存储数据。

选项3

为您的角色创建一个C#类文件,为您的类创建另一个。

使用方法创建两个C#类文件,并从主程序或需要它们的地方调用它们。

方法教程:https://msdn.microsoft.com/en-us/library/ms173114.aspx

课程教程:https://msdn.microsoft.com/en-us/library/x9afc042.aspx