L2SQL生成具有默认无参数构造函数的实体。这不能改变,因为它需要实现对象。
但是,如果我的对象只能使用初始化的某些值创建,那么我将如何隐藏无参数构造函数,以便使用者只能看到带参数的构造函数?
1)我可以创建另一个同名的部分类,并在那里添加我的新构造函数,但是消费者现在只有两个选项来创建我的类的实例。无参数构造函数仍然可见。
2)使用界面。无法创建定义构造函数的接口。
人们如何处理这个问题,因为它看起来像是一个会发生很多问题。
答案 0 :(得分:1)
如果我理解正确,你想阻止该类的其他用户从无参数构造函数构造一个,但仍允许Linq2SQL使用它(因为它必须这样做)。
幸运的是,当你说无法更改默认的无参数构造函数时,你错了。如果将Linq2SQL实体类的构造函数更改为私有,则Linq2SQL仍将调用它,因为它使用反射,如果使用反射,则可以调用私有构造函数。 (顺便说一句,构造函数的其他更改也可以使用Linq2SQL完成。)
当然,该类的其他用户也可以使用反射来调用该私有构造函数并在私有状态下创建一个类,但对于所有.NET类都是如此(并且确实适用于其他地方 - 例如,它通常并不难篡夺C ++类的隐私,尽管没有任何与实现无关的保证。但是,几乎总是可以使用反射来弄乱一堂课;封装是一种确保正确性而非安全性的机制。 (但是对于什么代码可以使用反射的安全限制,然后在不那么保证的基础上构建安全性)。