如何使基础架构代码仅在命名空间中可见?

我有一个Shunting-Yard算法的实现,我试图清楚地集成到我们的框架中。 目前我把它全部打包成一个带有简单公共接口的类。

namespace MathematicalParser { public class ExpressionParser { public ExpressionParser(string expression, List variables); public double GetNumericValue(Dictionary variableValues); } } 

在这个类中,有很多辅助类,辅助枚举,静态变量等,可以将不同的名称映射到函数。 所有这些都是私有的,因此库的用户无需担心。

为了提高代码的可维护性,我试图将逻辑上不相关的代码分离到他们自己的类中,但这些类在ExpressionParser之外没有任何意义,所以我想限制它们对名称空间MathematicalParser的可见性。 (仅包含ExpressionParser)。

如何在c#中最好地完成此任务,内部关键字仅适用于程序集,而private不能用于名称空间。

我不会这样做(与Joe相同),但这里是另一个从Lopina的答案中得出的解决方案: 嵌套类+部分类

PublicClass.cs:

 namespace MyNamespace { public partial class PublicClass { public int ReturnSomeStuff() { MyHelperClass1 tmp = new MyHelperClass1(); MyHelperClass2 tmp2 = new MyHelperClass2(); return tmp.GetValue1() + tmp2.GetValue2(); } } } 

PrivateClass1.cs:

 namespace MyNamespace { public partial class PublicClass { private class MyHelperClass1 { public int GetValue1() { return 5; } } } } 

PrivateClass2.cs:

 namespace MyNamespace { public partial class PublicClass { private class MyHelperClass2 { public int GetValue2() { return 10; } } } } 

Program.cs中:

 public class Program { private static void Main(string[] args) { PublicClass tmp = new PublicClass(); MyHelperClass2 zz; // Can't access MyHelperClass2 here cause it's private Console.WriteLine(tmp.ReturnSomeStuff()); Console.ReadLine(); } } 

正如您所看到的,您的不同帮助程序类在不同的文件中是物理分离的(也许它可以帮助您维护代码)。 而且你不能直接访问它们,它们是PublicClass私有。

您是否尝试过使用私有嵌套类?
看看这里: C#中的私有内部类 – 为什么不经常使用它们?

如果您真的非常渴望这样做(根据我对原始问题的评论),您可以将所有帮助程序类放入单个程序集中并使其成为内部程序,这样它们就可以有效地关闭使用。 然后进行第二次assembly,即人们使用的assembly,并将“公共”类和方法放在第二个assembly中。 然后使用InternalsVisibleTo允许“公共”程序集使用其他“私有”程序集的帮助程序类和方法。

http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute.aspx

这意味着您必须强制使用您的库的人在与包含您的“公共”库代码的程序集不同的程序集中工作。 我想从你的问题来看,你说他们在同一个程序集中工作,在这种情况下你必须将’public’库分成不同的程序集。 如果你这样做了,那么简单地将方法设置为内部并将它们放在同一个程序集中就可以完成这项任务。

如果你采用双assembly路线并且如果你的同事正在使用同一个assembly体,那么至少在引用另一个可能阻止它们使用它的assembly体时会有额外的“步骤”。

如果还不够……我不知道,写一个WCF网络服务并完成*。

*那是讽刺