C# 如何定义仅在类库项目中使用的类的范围?
我有一个带有一些公共类和许多内部实用程序类的类库。这些实用程序不应该对链接DLL的用户可见/可用C# 如何定义仅在类库项目中使用的类的范围?,c#,oop,class,scope,visibility,C#,Oop,Class,Scope,Visibility,我有一个带有一些公共类和许多内部实用程序类的类库。这些实用程序不应该对链接DLL的用户可见/可用 namespace MyProject { public class PublicClass { } } namespace MyProject { internal class UtilClass { } } 当我这样做时,VS会触发错误,例如“UtilClass比PublicClass.Member更难访问” 我做错什么了吗?我应该怎么做?我见过一些库中有我不能使用的私有类。我
namespace MyProject {
public class PublicClass { }
}
namespace MyProject {
internal class UtilClass { }
}
当我这样做时,VS会触发错误,例如“UtilClass比PublicClass.Member更难访问”
我做错什么了吗?我应该怎么做?我见过一些库中有我不能使用的私有类。我如何获得这种行为
谢谢。您的错误很常见。例如,如果您有两个类:
public class PublicClass { ... }
及
这将不会返回任何错误。但是如果您添加PublicClass a属性,如
public PrivateClass MyProperty { ... }
你会得到一个错误。因为该属性对于库的用户是可见的,但是属性的类型是不可见的 你的错误很常见。例如,如果您有两个类:
public class PublicClass { ... }
及
这将不会返回任何错误。但是如果您添加PublicClass a属性,如
public PrivateClass MyProperty { ... }
你会得到一个错误。因为该属性对于库的用户是可见的,但是属性的类型是不可见的 这意味着您的
PublicClass
中有public类型为UtilClass
的成员。编译器不允许这样做,因为外部程序集可以访问公共成员,但成员本身的类型是内部的,因此不可访问
将该成员设置为内部成员而不是公共成员。这意味着您的
公共类中有一个public类型为UtilClass
的成员。编译器不允许这样做,因为外部程序集可以访问公共成员,但成员本身的类型是内部的,因此不可访问
将该成员设置为内部成员,而不是公共成员。我怀疑您没有向我们展示完整的代码,因为您提供的代码应该是有效的
您必须有一个公共方法或属性来返回内部类的实例,例如
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.
}
}
这显然无法完成,因为外部程序集需要了解它
如果你真的需要一个公开行为而不暴露内部类型的公共属性,那么考虑一个实用工具类可以实现的接口。
这将允许您将helper类保持在内部,但仍然(通过接口)将其公开给外部程序集
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.
}
}
我怀疑您没有向我们展示完整的代码,因为您所提供的应该是有效的
您必须有一个公共方法或属性来返回内部类的实例,例如
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.
}
}
这显然无法完成,因为外部程序集需要了解它
如果你真的需要一个公开行为而不暴露内部类型的公共属性,那么考虑一个实用工具类可以实现的接口。
这将允许您将helper类保持在内部,但仍然(通过接口)将其公开给外部程序集
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.
}
}
听起来您在PublicClass
中有类型为UtilClass
的protected
或public
成员。将该成员的可视性降低到内部
。您的代码应按原样编译。此代码未演示问题,请发布其余代码。然而,CodesInChaos的建议很可能是原因。作为参考,将来如果你能够发布所有代码,人们回答你的问题会更容易。我这么说是因为正如@CodesInChaos所说的,您发布的代码是编译的。这有意义吗?听起来您在PublicClass
中有一个protected
或public
类型的UtilClass
成员。将该成员的可视性降低到内部
。您的代码应按原样编译。此代码未演示问题,请发布其余代码。然而,CodesInChaos的建议很可能是原因。作为参考,将来如果你能够发布所有代码,人们回答你的问题会更容易。我这么说是因为正如@CodesInChaos所说的,您发布的代码是编译的。这有意义吗?