3

背景

我正在为一个小型个人游戏项目编写一些组件(这种组件)。在该系统中,实体具有属于不同类别的各种类型的组件。例如,组件的IController类别包括KeyboardControllerAiController。一个实体有一组组件,并且每个类别应该只有一个组件。所有组件都继承自IComponent

组件有一个MetaType属性,它应该报告它们对应的类型,以便说:“嘿,请把我当作这种类型的组件!” 此属性返回一个Type对象。AiController返回typeof(IController) ,告诉实体将此视为其控制器。其他有效的 MetaType 是typeof(AiController)typeof(IComponent)。它不应该能够返回任何任意类型,例如typeof(int) - 只是组件类型。

我的问题

目前,我的组件可以报告 MetaType 的任意类型。例如,AIController实际上可以返回typeof(int) ——毕竟这是一个有效的 Type 对象。

我可以限制Type值,使得唯一有效的类型是IComponent是其祖先的任何类或接口的类型吗?我想这样的变量声明可能如下所示:

Type<IComponent> component; // This can only store certain types
Type where Type : IComponent component; // This too

我对这是否可能特别感兴趣——在替代方法中没有那么多(我知道有几种方法,它们包括只允许这种行为,因为我是唯一使用此代码的人。

4

2 回答 2

4

您可以创建一个MetaType对象,其构造函数或工厂方法将采用受约束的泛型类型IComponent并提供对非约束的访问Type。但是由于它的构造函数是受约束的,所以应该保证你不会得到其他非 IComponent。

public class MetaType
{
    public Type ComponentType { get; private set; }

    private MetaType(Type componentType)
    {
        this.ComponentType = componentType;
    }

    public static MetaType Create<T>() where T : IComponent
    {
        return new MetaType(typeof(T));
    }
}

您的用法可能如下所示:

MetaType validType = MetaType.Create<IComponent>(); //fine
MetaType validType = MetaType.Create<IController>(); //fine
MetaType validType = MetaType.Create<AIController>(); //fine

MetaType invalidType = MetaType.Create<int>(); //compiler error!

编辑:我假设您的IController接口继承自IComponent,但如果不是,您可以添加工厂重载,CreateController并且CreateComponent每个重载都受唯一接口的约束。

于 2013-04-12T01:25:18.630 回答
1

不幸的是,不是直接的——虽然你可以在泛型中约束类型参数,但不能约束像你的字段这样的类型变量。MetaType这基本上就像试图约束一个int:您可以使用异常来确保它永远不会设置为无效值,但最终变量本身可以是正确类型的任何东西。

于 2013-04-12T01:05:58.640 回答