单独的dll中的局部类


154

在单独的DLL中,局部类是否可以具有两个部分(相同的名称空间,相同的类名称)?


就像其他人说的那样,这是不可能的,但是有一些方法可以用来自不同来源的新行为来补充类,您究竟想在不同的dll中做什么?
奥赞

就我而言,我想向第3方库中定义的类添加几个静态方法。扩展方法将无效,接口和继承也将无效,因为该类是静态的。在发现您可以拥有部分静态类之后,我来到这里来了解它是否适​​用于程序集,但是看起来这也不行。

Answers:



36

否。局部类是纯粹的语言功能。汇编时,将文件合并以创建类型。无法将文件散布到不同的程序集中。

但是,根据您要执行的操作,您也许可以使用扩展方法来完成所需的操作。



8

尽管其他答案的确提供了令人讨厌的“否”字样,使该页面上的任何人都不想看到或听到,但我被另一个尚未提及的想法所震惊。如果允许跨程序集使用部分类,则可以访问非他编写的现有类型的私有成员,从而允许他以原始作者不希望的方式操纵它们,从而危害所有继承类的功能。太。

不仅如此,还需要重新编译其他程序集(及其子程序)中的那些类,以使其起作用。因此,在逻辑上不可能允许将类拆分为不同的程序集。


如果确实需要,可以通过反射轻松地与私人成员搞混。无法在程序集之间拆分类,因为不允许使用循环引用,并且需要使用循环引用才能使类的不同部分进行交互。
Zar Shardan

6

要将扩展方法添加到其他dll中的类时,可以使用扩展方法。这种方法的一个缺点是您不能添加静态方法。


3

问题是,为什么要在另一个程序集中创建局部类?您可以定义跨程序集的抽象类和接口,也许您需要研究一下。


10
恕我直言,有一些有效的情况,例如:您可能想将MVC表单注释添加到在不同程序集中定义的模型类中。程序集本身不知道在哪个上下文中使用它,因此程序集中的类不应具有任何注释。但是,可以将它们添加到MVC上下文中的局部类中(如果可能)。
nyi 2014年

3
nyi,为什么不只是从该类继承并在顶部声明您的属性?如果愿意,甚至可以使用相同的名称。
Gleno 2014年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.