C#将类放入字典并在调用时创建新实例

And*_*dré 1 c# class instances

这看起来真的很混乱,但我想创建一个填充了不同类作为值的字典,然后使用字母作为键.当我在该词典中调用一个键时,我需要它来表现我正在键入"new ClassInDictionary".

这样我就可以创建一个文本文件,其中包含定义不同块的不同符号.

为了帮助清理这里我的当前代码:

blockIdentifier.Add("=", new BlockAir()); // Define which class corresponds to which letter
blockIdentifier.Add("-", new BlockDirt());

for (int mapX = 0; mapX < mapWidth; mapX++)
{
    for (int mapY = 0; mapY < mapHeight; mapY++)
    {
        try
        {
            Block block = blockIdentifier[mapSplit[mapY].Substring(mapX, 1)]; // Simply find which letter to use, let's pretend it's: "="
            // The line above should be creating a new instance of the class BlockAir                                                 
            block.blockX = mapX * 45; 
            block.blockY = mapY * 45;

            mapList[mapY, mapX] = block; 
        }
        catch (Exception)
        {
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

变量blockIdentifier:

public static Dictionary<string, Block> blockIdentifier = new Dictionary<string, Block>();
Run Code Online (Sandbox Code Playgroud)

和BlockDirt:

 public class BlockDirt : Block
{
    public int hi;

    public BlockDirt()
        : base("Dirt Block.png", 0, 0, true)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

我只需要调用blockIdentifier ["="]并获取类BlockDirt()的新实例,我该怎么做?

Ala*_*anT 8

您是想每次创建块的新实例还是重新使用块的单个实例?

从代码看起来好像每次都要创建一个新代码.如果是这样,一种方法是使Dictionary<string, Func<Block>>所有块继承自Block(或IBlock,这可能会更好).

注意
假设BlockAir : IBlockBlockDirt : IBlock

var blockLookup = new Dictionary<string, Func<IBlock>>();
blockLookup.Add("=", ()=> new BlockAir());
blockLookup.Add("-", ()=> new BlockDirt());

...

mapList[x,y] = blockLookup[symbol]();

...
Run Code Online (Sandbox Code Playgroud)

或者沿着那些方向(我现在还没有访问开发环境,所以对任何错误道歉)

  • +1-太棒了-我当时在考虑“构造函数”,但存储lambda进行创建是一种更好的方法。好决定。 (2认同)