具有泛型类声明的命名空间约束

时间:2010-06-13 13:43:04

标签: c# generics parameters constraints

我想知道是否(如果是这样的话)可以将命名空间定义为泛型类声明中的约束参数。

我拥有的是:

namespace MyProject.Models.Entities< - 包含要在db中保留的类

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并使用继承映射实体,尽管可能,但增加了一层不需要的复杂性。

那么,是否可以将泛型类参数约束到命名空间而不是特定类型?

4 个答案:

答案 0 :(得分:11)

无法为命名空间创建任何此类约束。

更优选的解决方法是制作通用类internal而不是public。这意味着该类只能由直接实例化并由同一程序集中的类访问(除非您使用InternalsVisibleTo属性)。但是,它仍然可以间接实例化(即作为公共类的受保护/私有成员)。

答案 1 :(得分:3)

命名空间约束没有价值。任何第三方都可以创建一个类并将该类放入同一个名称空间。

答案 2 :(得分:2)

编译器不会为您执行此检查。您可以在运行时验证此约束,可能在您的类型的静态构造函数中。

答案 3 :(得分:0)

最好的方法是创建一个接口并在您的类中使用此接口,然后将此接口添加到您的约束中