Я хотел бы знать, возможно ли (и раз так как) определить пространство имен как параметр ограничения в универсальном объявлении класса.
То, что я имею, является этим:
namespace
MyProject. Модели. Объекты <-Содержат мои классы, которые будут сохранены в дб
namespace
MyProject. Тесты. BaseTest <-Очевидный я думаю
Теперь объявление моего класса 'BaseTest' похоже так;
public class BaseTest<T>
Это BaseTest
делает немного больше (во время записи), чем удаляют все объекты, которые были добавлены к базе данных во время тестирования. Так же обычно мне объявят тестовый класс как:
public class MyEntityRepositoryTest : BaseTest<MyEntity>
То, что я ХОТЕЛ БЫ сделать, является чем-то подобным следующему:
public class BaseTest<T> where T : <is of the MyProject.Models.Entities namespace>
Теперь я знаю, что было бы совершенно возможно просто объявить класс 'BaseEntity', из которого все объекты создали в MyProject.Models.Entities
пространство имен наследуется;
public class BaseTest<T> where T : MyBaseEntity
но... Я не на самом деле должен или хочу. Плюс я использую ORM и отображаю объекты с наследованием, хотя возможно, добавляет слой сложности, которая не требуется.
Так, действительно ли возможно ограничить универсальный параметр класса к пространству имен и не определенному типу?
Создать такие ограничения пространств имен.
Более предпочтительным обходным решением было бы сделать общий класс внутренним
, а не открытым
. Это означает, что класс может быть напрямую создан и доступен только классам в той же сборке (если вы не используете атрибут InternalsVisibleTo
). Однако он все еще может быть косвенно создан (то есть как защищенный / закрытый член открытого класса).
Ограничение пространства имен не имеет значения. Любая третья сторона может создать класс и поместить его в то же пространство имен.
Компилятор не будет выполнять эту проверку за вас. Однако вы можете проверить это ограничение во время выполнения, возможно, в статическом конструкторе для вашего типа.