C #: Как спроектировать универсальный класс так, чтобы параметр типа должен наследовать определенный класс? - PullRequest
2 голосов
/ 22 декабря 2011

Я написал класс, который выглядит следующим образом:

public class MyClass<T>
{
    public void doSomething()
    {
       T.somethingSpecial;
    }
}

Этот код не компилируется, потому что компилятор понятия не имеет, что такое T.Я хотел бы ограничить T так, чтобы он наследовал определенный класс, который определяет somethingSpecial.Бонусные баллы, если вы можете сказать мне, как сделать то же самое, противопоставив T так, чтобы он реализовывал определенный интерфейс.

Ответы [ 6 ]

14 голосов
/ 22 декабря 2011
public class MyClass<T> where T: IAmSomethingSpecial

Это называется Ограничения на параметры типа .

4 голосов
/ 22 декабря 2011

То, что вы хотите, является универсальным ограничением :

public class MyClass<T> where T : SomeParentClass
4 голосов
/ 22 декабря 2011

Используйте следующее ограничение параметра типа в объявлении класса:

public class MyClass<T> where T : MyBaseClass

Подробнее о ограничениях параметров типа можно прочитать, например, здесь, по адресу MSDN .

1 голос
/ 22 декабря 2011
public interface ISomeInterface
{
    void DoSomething();
}

public class MyClass<T> where T : ISomeInterface
{
    public void doSomething()
    {
       T.DoSomething();
    }
}

Ключевое слово where позволяет указать ограничения для данного универсального типа.Вы можете поменять интерфейс для класса.

1 голос
/ 22 декабря 2011

Прочитайте документацию.Родовое ограничение.

class MyClass<T> where T : someinterfaceorbaseclassthatTmustinherit
1 голос
/ 22 декабря 2011

Вам необходимо Общее ограничение :

public class MyClass<T> where T : ISomeInterface
{
  public void doSomething()
  {
    instanceOfT.somethingSpecial();
  }
}
...