2016-12-27 6 views
1

Я даже не уверен, как лучше всего сформулировать вопрос, но я посмотрю, что я могу сделать.C# Generics и Type Safety at Runtime

У меня есть цель, но я не знаю, как это сделать, или, если возможно, достичь этого.

Предположим, у меня есть тип Sport. А затем есть Team<Sport> и Player<Sport>. Я хотел бы сделать так, чтобы в любое время, когда у меня есть команда и игрок, взаимодействуя с помощью методов, они могут делать это только в том случае, если у них одинаковый тип <Sport>.

Например: Team<Sport>.AddPlayer(Player<Sport> player) < - Как я могу это сделать, так что это можно назвать только тогда, когда оба Sport s одного типа? Если мне нужно получить новые типы из Sport, это может сработать, но я надеялся сделать это на основе экземпляра во время выполнения.

Я знаю, что компилятор не будет знать о случаях раньше времени, поэтому я думаю, что мне интересно, есть ли какая-то волшебная магия безопасности, которую вы можете сделать, чтобы сделать это, поэтому мне не нужно сравнивать типы я каждый раз.

ответ

3

Вы не можете поместить экземпляры в <> в C#. Для достижения «безопасности типа» вам необходимо иметь фактические «типы», которые называются 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) { 
     // ... 
    } 
    // ... 
} 
+0

О, Дух, я полностью гасятся в этой части - они, конечно, должны быть типы, а не экземпляров. Это действительно имеет смысл, и, я думаю, выполняет то, что я хотел. Благодаря! – twchapman