2010-06-13 2 views
5

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

Что у меня есть это:

namespace MyProject.Models.Entities < - Содержит мои классы сохраняться в БД

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

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

ответ

10

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

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

+0

Согласовано. И, если тип, который вы хотите разрешить, находится в другой сборке, посмотрите на «InternalsVisibleToAttribute». Я использую это с модульными тестами в разных сборках регулярно. –

+0

Это позор, я удивлен, вы не можете что-то сделать с лямбда-выражениями или чем-то еще. Чтобы не волноваться, это «внутреннее» решение удовлетворяет мои потребности на полпути. Спасибо за руководство. – SomeGuy

+0

@SomeGuy, насколько я знаю, lambdas по-прежнему остается только временем выполнения (за исключением случаев, когда используется с выражениями, но даже тогда они не исполняются во время компиляции). Было некоторое обсуждение о том, может ли предполагаемая функция компилятора как функция C# 5.0 допускать некоторую настройку компилятора, хотя у меня есть сомнения, если мы когда-нибудь это увидим. –

2

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

3

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

Смежные вопросы