2

私はゲームのコンポーネントエンティティシステムを書いていますが、少し障害にぶつかりました。List<Component>エンティティのすべてのコンポーネントを含むComponentListという派生クラスがあります。GetComponentというコンポーネントを返すメソッドもあります。これは文字列名で行われます。

    public Component GetComponent(string name)
    {
        foreach (var c in this)
        {
            if (c.Name == name)
                return c;
        }
        throw new Exception("Component " + name + " does not exist.");
    }

ただし、Componentからクラスを派生させ、それをComponentListに貼り付けてから引き戻す場合、その型にキャストする必要があります。これは少し不便です。

TestComponent t1 = (TestComponent)Entity.ComponentList.GetComponent("Test1");

<T>のタイプを取得するための特別な魔法の方法があることは知っていますが、それをどのように使用するか、またはこの状況に適用できるかどうかはわかりません。なにか提案を?

4

1 に答える 1

3

コード:

public T GetComponent<T>(string name) where T : Component
{
    var result = this.FirstOrDefault(c => c.Name == name);
    if( result == null )
        throw new Exception("Component " + name + " does not exist.");
    return (T) result;
}

使用法:

var testComponent = componentFactory.GetComponent<TestComponent>("Test1");

これを可能にする言語機能が呼び出され、 MSDNgenericsで詳細を読むことができます(そして他の多くの場所、「ジェネリックC#」はグーグルで)

于 2012-12-19T00:48:20.623 に答える