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

C# 具有泛型类声明的命名空间约束,c#,generics,parameters,constraints,C#,Generics,Parameters,Constraints,我想知道在泛型类声明中是否可以将名称空间定义为约束参数(以及如何定义) 我所拥有的是: namespaceMyProject.Models.Entities不可能对名称空间创建任何此类约束 更可取的解决方法是将泛型类设置为内部,而不是公共。这意味着该类只能由同一程序集中的类直接实例化和访问(除非使用该属性)。但是,它仍然可以间接实例化(即作为公共类的受保护/私有成员)。编译器不会为您执行此检查。不过,您可以在运行时验证此约束,可能是在您的类型的静态构造函数中。命名空间约束没有任何价值。任何第三方

我想知道在泛型类声明中是否可以将名称空间定义为约束参数(以及如何定义)

我所拥有的是:


namespace
MyProject.Models.Entities不可能对名称空间创建任何此类约束


更可取的解决方法是将泛型类设置为
内部
,而不是
公共
。这意味着该类只能由同一程序集中的类直接实例化和访问(除非使用该属性)。但是,它仍然可以间接实例化(即作为公共类的受保护/私有成员)。

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

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

最好的方法是创建一个接口并在类中使用该接口,然后将该接口添加到约束中。而且,如果要允许的类型位于不同的程序集中,请查看
内部visibletoAttribute
。我经常在不同程序集中的单元测试中使用它。这是一个遗憾,我很惊讶你不能使用lambda表达式或其他东西。不用担心,“内部”解决方案满足了我的一半需求。谢谢你的指导。@SomeGuy,据我所知,lambda仍然只是一个运行时的东西(除了与表达式一起使用时,但即使这样,它们在编译时也不是可执行的)。关于未来的C#5.0编译器即服务功能是否允许对编译器进行一些定制,有一些讨论,尽管我怀疑我们是否会看到这一点。
public class BaseTest<T>
public class MyEntityRepositoryTest : BaseTest<MyEntity>
public class BaseTest<T> where T : <is of the MyProject.Models.Entities namespace>
public class BaseTest<T> where T : MyBaseEntity