如何使用 C# 语言比较泛型类型?

How to compare generic types usnig c# language?

我正在 Unity 中制作游戏,我正在使用一种工厂模式,我需要在其中创建特定类型的 Tile 对象,但我不确定如何在 C# 中比较类型。

这是我的代码:

public T SpawnTile<T>(Vector3 startPosition) where T : Tile

{

    Tile t;

    if(T == MountainTile) // This line

    {

        t = new MountainTile();

    }

    if (T == WaterTile) // And this line

    {

        t = new WaterTile();

    }

    return (T)t;

}

我到处搜索,发现obj的用法是Type,但在我的例子中,我想比较通用类型T。

我也试过Types.Equals(T, WaterTile)但是没用。有什么建议吗?

当然可以用typeof关键字来比较:

public T SpawnTile<T>(Vector3 startPosition) where T : Tile
{

    T t;

    if(typeof(T) == typeof(MountainTile)) // This line
    {

       t = new MountainTile();

    }

    if (typeof(T) == typeof(WaterTile)) // And this line
    {

       t = new WaterTile();

    }

    return t;

}

但是,正如评论中提到的,如果可能,最好使用 new 约束:

public T SpawnTile<T>(Vector3 startPosition) where T : Tile, new()
{
    T t = new T();

    // Other actions...

    return t;
}

为您做这项工作吗?

Tile t;
var type = T as Type
switch (type)
{
    case Type _ when type == typeof(MountainTile):
         t = new MountainTile();
        break;

    case Type _ when type == typeof(WaterTile):
        t = new WaterTile();
        break;
}