1

我有一个包含一些公共类和许多内部实用程序类的类库。这些实用程序不应该对链接到 DLL 的人可见/不可用。

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

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

难道我做错了什么?我应该怎么做?我见过我不能使用的带有私有类的库。我如何得到这种行为?

谢谢。

4

3 回答 3

7

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

使该成员成为内部成员而不是公开成员。

于 2012-08-22T11:00:47.940 回答
1

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

public class PublicClass { ... }

private class PrivateClass { ... }

这将不返回任何错误。但是,如果您将 PublicClass 添加一个属性,例如

public PrivateClass MyProperty { ... } 

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

于 2012-08-22T10:58:34.650 回答
1

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

您必须具有返回内部类 EG 实例的公共方法或属性

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.
    }
}
于 2012-08-22T11:02:19.180 回答