运行时的 C# 泛型和类型安全
C# Generics and Type Safety at Runtime
我什至不确定如何最好地表达这个问题,但我会看看我能做些什么。
我有一个目标,但我不确定如何实现它,或者如果我能实现它。
假设我有一个类型Sport
。然后是 Team<Sport>
和 Player<Sport>
。我想做到这样,每当我有一个团队和一个玩家通过方法进行交互时,他们只有在具有相同的 <Sport>
类型时才能这样做。
例如:Team<Sport>.AddPlayer( Player<Sport> player)
<- 我怎样才能做到只有当两个 Sport
是同一类型时才能调用它?如果我必须从 Sport
派生新类型,那可能会起作用,但我希望在运行时基于实例来完成。
我知道编译器不会提前知道这些实例,所以我想我想知道是否可以使用某种类型安全魔法来实现它,这样我就不必比较每次都自己打字
您不能在 C# 中将实例放入 <>
。要实现 "type safety",您需要实际调用 "types" Tennis
、Hockey
、Badminton
等。否则编译器无法区分运动。
要么在运行时检查运动类型是否相同,要么创建 Sport
的子类,如 Tennis
、Badminton
和 Hockey
。既然你想要编译时的类型安全,你应该使用后一种方法。
您可以这样做:
var tennisTeam = new Team<Tennis>();
tennisTeam.AddPlayer(new Player<Tennis>());
Team
可以这样定义:
class Team<TSport> where TSport : Sport {
public void AddPlayer(Player<TSport> player) {
// ...
}
// ...
}
我什至不确定如何最好地表达这个问题,但我会看看我能做些什么。
我有一个目标,但我不确定如何实现它,或者如果我能实现它。
假设我有一个类型Sport
。然后是 Team<Sport>
和 Player<Sport>
。我想做到这样,每当我有一个团队和一个玩家通过方法进行交互时,他们只有在具有相同的 <Sport>
类型时才能这样做。
例如:Team<Sport>.AddPlayer( Player<Sport> player)
<- 我怎样才能做到只有当两个 Sport
是同一类型时才能调用它?如果我必须从 Sport
派生新类型,那可能会起作用,但我希望在运行时基于实例来完成。
我知道编译器不会提前知道这些实例,所以我想我想知道是否可以使用某种类型安全魔法来实现它,这样我就不必比较每次都自己打字
您不能在 C# 中将实例放入 <>
。要实现 "type safety",您需要实际调用 "types" Tennis
、Hockey
、Badminton
等。否则编译器无法区分运动。
要么在运行时检查运动类型是否相同,要么创建 Sport
的子类,如 Tennis
、Badminton
和 Hockey
。既然你想要编译时的类型安全,你应该使用后一种方法。
您可以这样做:
var tennisTeam = new Team<Tennis>();
tennisTeam.AddPlayer(new Player<Tennis>());
Team
可以这样定义:
class Team<TSport> where TSport : Sport {
public void AddPlayer(Player<TSport> player) {
// ...
}
// ...
}