如何仅在类库项目中使用类的范围?

时间:2012-08-22 10:55:22

标签: c# oop class scope visibility

我有一个包含一些公共类的类库,以及许多内部实用程序类。对于链接DLL的人来说,这些实用程序不应该是可见/可用的。

namespace MyProject {
    public class PublicClass { }
}
namespace MyProject {
    internal class UtilClass { }
}

当我这样做时,VS会触发错误,例如“UtilClass比PublicClass.Member更难访问”

我做错了吗?我该怎么做?我见过有私人课程的图书馆,我不能使用。我该如何得到这种行为?

感谢。

3 个答案:

答案 0 :(得分:6)

这意味着您的UtilClass中有PublicClass类型的公开成员。编译器不允许这样做,因为外部程序集能够访问公共成员,但成员本身的类型是内部的,因此不可访问。

将该成员设为内部而非公开。

答案 1 :(得分:1)

你的错误很常见。例如,如果您有两个类:

public class PublicClass { ... }

private class PrivateClass { ... }

这将不会返回任何错误。但是如果你为PublicClass添加一个像

这样的属性
public PrivateClass MyProperty { ... } 

你会收到错误。因为该属性对于您的库的用户是可见的,但是该属性的类型不可见。

答案 2 :(得分:1)

我怀疑您没有向我们展示完整的代码,因为您提供的代码应该正常工作。

您必须拥有一个返回内部类E.G。

实例的公共方法或属性
namespace MyProject 
{
    public class PublicClass 
    {
        public UtilClass DoSomething() {} 
        public UtilClass { get; }
        // External assemblies cannot see the UtilClass  type which is
        // why this does not work.
    }
}

这显然无法完成,因为外部装配需要了解它。

如果你真的需要一个暴露行为的公共属性而不暴露你的内部类型,那么考虑使用你的实用程序类可以实现的接口。

这将允许您将辅助类保持在内部但仍然(通过接口)将其暴露给外部程序集。

internal class UtilClass : IMyPublicInterface 
{ 
}

namespace MyProject 
{
    public class PublicClass 
    {
        public IMyPublicInterface DoSomething() {} 
        public IMyPublicInterface { get; }
        // External assemblies now only need to know about the public interface.
    }
}