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)
        {
        }
    }
}

変数 blockIdentifier:

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

毎回ブロックの新しいインスタンスを作成しますか、それともブロックの 1 つのインスタンスを再利用しますか?

コードからは、毎回新しいものを作成したいように見えます。もしそうなら、1 つの方法はDictionary<string, Func<Block>>、すべてのブロックが Block (または IBlock の方が少し良いかもしれません) から継承するようにすることです。

note
前提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し、リフレクションを介してオブジェクトを作成することでこれを行うことができます。ちょっとハッキーかもしれませんが、うまくいくと思います。

ディクショナリで 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 に答える