Ограничение пространства имен с объявлением универсального класса - PullRequest
6 голосов
/ 13 июня 2010

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

То, что у меня есть, это:

namespace MyProject.Models.Entities <- Содержит мои классы, которые необходимо сохранить в db </p>

namespace MyProject.Tests.BaseTest <- Очевидно, я думаю </p>

Теперь объявление моего класса 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 и отображаю сущности с наследованием, хотя возможно и добавляет уровень сложности, который не требуется.

Итак, можно ли ограничить универсальный параметр класса пространством имен, а не конкретным типом

Ответы [ 3 ]

12 голосов
/ 13 июня 2010

Невозможно создать какие-либо такие ограничения для пространств имен.

Более предпочтительным обходным решением будет сделать ваш общий класс internal, а не public.Это означает, что класс может быть * непосредственно создан и доступен для классов в одной сборке (если только вы не используете атрибут InternalsVisibleTo).Тем не менее, он все еще может быть создан косвенно (т.е. как защищенный / закрытый член публичного класса).

4 голосов
/ 13 июня 2010

Ограничение пространства имен не будет иметь значения.Любая третья сторона может создать класс и поместить этот класс в то же пространство имен.

2 голосов
/ 13 июня 2010

Компилятор не выполнит эту проверку за вас. Вы можете проверить это ограничение во время выполнения, возможно, в статическом конструкторе для вашего типа.

...