Принудительная реализация универсального интерфейса в C # - PullRequest
8 голосов
/ 30 августа 2010

Есть ли в любом случае принудительное ограничение для универсального определения для реализации «универсального интерфейса» ... то есть я хочу, чтобы класс поддерживал передачу интерфейса, а универсальный класс ограничивал его, чтобы класс реализовывал интерфейс. Например, если я скажу:

MyGenericClass<IMyInterface, MyImplementation>.DoSomething();

Это должно быть ограничено, чтобы MyImplementation реализовывал IMyInterface

Насколько я знаю, это может быть достигнуто

public class Dynamic_Loader<T, S> where S: T

Теперь, есть ли способ заставить T быть интерфейсом?

Редактировать: Цель этого состояла в том, чтобы иметь что-то вроде:

private static List<T> interfaceList = new List<T>();

public static List<T> InterfaceList {get { return interfaceList;}}

public static void Add(S input) { interfaceList.Add(input);}

и список ограничен только интерфейсами (поскольку предполагается, что он возвращает реализации определенных интерфейсов)

Ответы [ 3 ]

7 голосов
/ 30 августа 2010

Вы имеете в виду, можно ли также наложить ограничение на T, как where T : interface?

Если это так, то нет : этоlist в значительной степени охватывает ваши варианты.

То, что у вас есть, настолько близко, насколько это возможно, я считаю.

Из любопытства, что было бы причиной того, что вы хотите ограничить T быть интерфейсом?

Или вы имеете в виду, можно ли также наложить ограничение T для T до реализовать какой-то определенный интерфейс?

Если это так, то да : просто есть два предложения where (например, where S : T where T : U).

3 голосов
/ 30 августа 2010
where T: IMyOtherInterfaceForT

Пример:

    public class Test<T, V>
    where T : V
    where V : IEnumerable<int>
    {
    }
2 голосов
/ 05 октября 2013

Вы можете сделать что-то подобное, чтобы принудительно применить его во время выполнения, а не во время компиляции.

public class Test<T> where T : class
{
  public Test()
  {
    Type t = typeof( T );
    if( !t.IsInterface )
      throw new ArgumentException( "T must be an interface type" );
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...