运行时的 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" TennisHockeyBadminton 等。否则编译器无法区分运动。

要么在运行时检查运动类型是否相同,要么创建 Sport 的子类,如 TennisBadmintonHockey。既然你想要编译时的类型安全,你应该使用后一种方法。

您可以这样做:

var tennisTeam = new Team<Tennis>();
tennisTeam.AddPlayer(new Player<Tennis>());

Team可以这样定义:

class Team<TSport> where TSport : Sport {
    public void AddPlayer(Player<TSport> player) {
        // ...
    }
    // ...
}