如何使用 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;
}
我正在 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;
}