我有一个包含一些公共类的类库,以及许多内部实用程序类。对于链接DLL的人来说,这些实用程序不应该是可见/可用的。
namespace MyProject {
public class PublicClass { }
}
namespace MyProject {
internal class UtilClass { }
}
当我这样做时,VS会触发错误,例如“UtilClass比PublicClass.Member更难访问”
我做错了吗?我该怎么做?我见过有私人课程的图书馆,我不能使用。我该如何得到这种行为?
感谢。
答案 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.
}
}