1

这看起来确实令人困惑,但我想创建一个字典,其中包含不同的类作为值,然后使用字母作为键。当我调用那个字典中的一个键时,我需要它表现得好像我正在输入“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)
        {
        }
    }
}

变量块标识符:

public static Dictionary<string, Block> blockIdentifier = new Dictionary<string, Block>();

和 BlockDirt:

 public class BlockDirt : Block
{
    public int hi;

    public BlockDirt()
        : base("Dirt Block.png", 0, 0, true)
    {
    }
}

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

4

3 回答 3

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]();

...

或沿着这些思路(我目前无法访问开发环境,因此对任何错误表示歉意)

于 2013-02-08T14:20:58.947 回答
1

您可以通过将ConstructorInfo对象存储在字典中然后通过反射创建对象来做到这一点。也许有点hacky,但我认为它会起作用。

这是在字典中使用 StringBuilder 构造函数的示例(您可以将其扔到 LINQPad 中以查看输出)。

var creator = typeof(StringBuilder).GetConstructor(new Type[]{});
var dict = new Dictionary<string, ConstructorInfo>();

dict["a"] = creator;

StringBuilder b = (StringBuilder)dict["a"].Invoke(new object[]{});
b.AppendLine("Hello World");
b.ToString().Dump();

因此,对于您的情况,您需要不同Block对象的构造函数:

var blockIdentifier = new Dictionary<string, ConstructorInfo>();
blockIdentifier["="] = typeof(BlockAir).GetConstructor(new Type[]{});
blockIdentifier["-"] = typeof(BlockDirt).GetConstructor(new Type[]{});
于 2013-02-08T14:17:20.840 回答
0

我想说最合乎逻辑的方法是Type在字典中有值

var blockIdentifier = new Dictionary<string, Type>();
blockIdentifier.Add("=", typeof(BlockDirt));
blockIdentifier.Add("-", typeof(BlockAir));

....

mapList[x,y] = blockIdentifier[symbol].GetConstructor(new Type[] { }).Invoke(null);
于 2013-02-08T14:49:12.650 回答