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");

调用了启用此功能的语言功能generics,您可以在MSDN上阅读更多相关信息(以及许多其他地方;只需 google 搜索“generics C#”)

于 2012-12-19T00:48:20.623 回答