У базовых классов есть базовые классы? - PullRequest
2 голосов
/ 18 февраля 2011

Я бы хотел передать универсальный интерфейс функции:

private I<T> CreateStubRepository<T, I >()
 where I : aGenericBaseClass

Так что мне было интересно, реализуют ли базовые интерфейсы базовый класс или конкретный интерфейс?

Я знаю, что с помощью рефлексии вы можете проверить, является ли это общий класс, но я не вижу, чтобы это помогло мне

Ответы [ 3 ]

1 голос
/ 18 февраля 2011

Хорошо.Какой смысл принудительно использовать любой интерфейс?Я действительно не понимаю (или ваш вопрос).

Скорее всего, вы должны сделать что-то вроде этого:

public interface IMyRepository<T>
{
}

public class Repository<T> : IMyRepository<T>
{
}


private IMyRepository<TEntity> CreateStubRepository<TEntity>()
{
     return new Repository<TEntity>();
}

var repos = CreateStubRepository<User>();

Обновление

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

Классы не наследуют интерфейсы.Они их реализуют.Различия тонкие, но важные.

Класс может наследовать только другой класс.Это означает, что если вы не укажете, что класс наследует от другого, он все равно будет наследовать от объекта.И это не изменится, независимо от того, сколько интерфейсов реализует класс.

class MyClass : ICoolInterface // inherits object
class MyList : ArrayList, ISomeInterface // inherits ArrayList
class MyGenericList<T> : IList<T> // inherits object.
0 голосов
/ 21 февраля 2011

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

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

Во время выполнения я знаю, что при использовании рефлексии я могу определить, является ли класс универсальным, вызывая: IsGenericType, который возвращает true, если тип является универсальным.

Итак, что я хотел знать, что может иметьбыло плохо объяснено, есть ли при использовании типов шаблонов в любом случае определить, является ли этот тип универсальным типом?Похоже, ответ «Нет»: IL взаимодействует с классом как универсальный, а не компилятор.

0 голосов
/ 19 февраля 2011

Универсальные или неуниверсальные классы могут реализовывать или наследовать от универсальных или неуниверсальных интерфейсов и классов. Единственное ограничение заключается в том, что полный тип любого интерфейса / класса, реализованного / унаследованного, должен быть различим, учитывая полный тип класса, выполняющего или наследующего. Например, Foo может наследоваться от FooBase и реализовывать IDisposable; FnordDuffleBag может наследоваться от DuffleBag и реализовывать IReachInto .

...