2010-06-13 21 views
5

Me gustaría saber si (y si es así cómo) es posible definir un espacio de nombres como un parámetro de restricción en una declaración de clase genérica.Restricción de espacio de nombres con declaración de clase genérica

Lo que tengo es la siguiente:

namespace MyProject.Models.Entities < - Contiene mis clases para ser persistido en db

namespace MyProject.Tests.BaseTest < - Obvio Creo

Ahora la declinación de mi clase 'BaseTest' se ve así;

public class BaseTest<T> 

Este BaseTest hace poco más (en el momento de la escritura) que retire todas las entidades que se han añadido a la base de datos durante la prueba. Así que por lo general voy a tener una clase de prueba declarada como:

public class MyEntityRepositoryTest : BaseTest<MyEntity> 

lo que me gustaría hacer es algo similar a lo siguiente:

public class BaseTest<T> where T : <is of the MyProject.Models.Entities namespace> 

Ahora soy consciente de que sería totalmente posible simplemente declarar una clase 'BaseEntity' desde la cual heredarán todas las entidades creadas dentro del espacio de nombres MyProject.Models.Entities;

public class BaseTest<T> where T : MyBaseEntity 

pero ... En realidad no necesito, o quiero. Además, estoy usando un ORM y entidades de mapeo con herencia, aunque es posible, agrega una capa de complejidad que no es necesaria.

Entonces, ¿es posible restringir un parámetro genérico de clase a un espacio de nombres y no a un tipo específico?

Respuesta

10

No es posible crear tales restricciones en los espacios de nombres.

Una solución más preferible sería hacer su clase genérica internal en lugar de public. Esto significa que la clase solo puede ser directamente instanciada y accedida por clases en el mismo ensamblaje (a menos que use el atributo InternalsVisibleTo). Sin embargo, todavía puede ser indirectamente instanciado (es decir, como un miembro protegido/privado de una clase pública).

+0

De acuerdo. Y, si el tipo que desea permitir está en un ensamblaje diferente, busque 'InternalsVisibleToAttribute'. Lo uso con pruebas unitarias en diferentes conjuntos regularmente. –

+0

Es una lástima, estoy sorprendido de que no puedas hacer algo con expresiones lambda o algo así. No se preocupe, esa solución 'interna' satisface mis necesidades a mitad de camino. Gracias por tu guía. – SomeGuy

+0

@SomeGuy, hasta donde yo sé, las lambdas siguen siendo solo una cosa de tiempo de ejecución (excepto cuando se usan con Expressions, pero incluso así no son ejecutables en tiempo de compilación). Se ha debatido sobre si la característica prospectiva del compilador como servicio de C# 5.0 podría permitir alguna personalización del compilador, aunque tengo mis dudas si alguna vez lo veremos. –

2

El compilador no realizará esta comprobación por usted. Sin embargo, podría verificar esta restricción en el tiempo de ejecución, tal vez en un constructor estático para su tipo.

3

Una restricción de espacio de nombres no tendría ningún valor. Cualquier tercero podría crear una clase y poner esa clase en el mismo espacio de nombres.

Cuestiones relacionadas