2016-12-27 69 views
1

我甚至不確定如何最好地解釋這個問題,但我會看看我能做些什麼。C#泛型和運行時類型安全

我有一個目標,但我不知道該怎麼做,或者甚至可以實現目標。

比方說,我有一個類型Sport。然後有Team<Sport>Player<Sport>。我想這樣做,任何時候我有一個團隊和一個球員通過方法進行交互,他們只能這樣做,如果他們有相同的<Sport>類型。

例如:Team<Sport>.AddPlayer(Player<Sport> player) < - 我該如何做到這一點,所以這隻能在Sport s是同一類型時才能調用?如果我必須從Sport派生新類型,那可以工作,但我希望在運行時基於實例來完成。

我知道編譯器不會提前知道實例,所以我想我想知道是否有某種類型的安全魔法可以做到,所以我不必比較類型我每次都是。

回答

3

您不能將實例放入C#中的<>。爲了實現「類型安全」,您需要具有稱爲TennisHockey,Badminton等的實際「類型」。否則,編譯器無法區分運動。

要麼你檢查各類運動的是否相同在運行時,或者你創建的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) { 
     // ... 
    } 
    // ... 
} 
+0

哦,真不錯,我完全空白的那一部分 - 當然,他們必須要的類型,不實例。我認爲,這確實是有道理的,並且完成了我想要的。謝謝! – twchapman