无法访问 DLL 外部的内部 类 并且无法访问某些 public 变量

Cannot access internal classes outside of DLL & certain public variables aren't accessible

我很难完成这项工作。

3 classes FooTypeWebAppIWebApp 不能在此 DLL 之外访问\可见。因此 sealed & internal classes.

我遇到的问题是...

1) 在 WebApp class 中,FeeType1RouteOneBuilder 方法的参数中不可访问。

2) 在 WebApp class 中,FeeType1 不可访问\在 switch 的 case 语句中可见。 (需要可见)。

3) 在 WebApp class 中,FeeType1 属性 的 CreditApplication 在开关的 case 语句中不可见(需要可见) .

这个复杂的脚本有更好的方法吗?我是不是已经因为在这个 DLL 之外暴露 classes 而被搞砸了?能否以不同方式解决所有步骤 1 到 4(或以某种方式修复)?

我不知道怎样才能使它更简单。

internal static class FooType
{
    public class FeeType
    {
        public FeeType() { }
        public string CreditApplication = "Credit Application";
        public string CreditVehicle = "Credit Vehicle";
    }
    public FeeType FeeType1
    {
       get { return new FeeType(); }
       private set { }
    }
}    
sealed class WebApp : IWebApp
{
    public string RouteOneBuilder(FooType.FeeType1 typing)
    {
       var xml = "";

       switch(typing)
       {
           case FooType.FeeType1.CreditApplication:
               xml = "asdf";
               break;
           default:
               throw new Exception("Unknown value");
       }

       return xml;
    }
}
internal interface IWebApp  
{
    string RouteOneBuilder(FooType.FeeType typing);
}

您对 sealed class 的定义不正确。它不是像 publicprivateprotectedinternal 这样的访问修饰符。标记一个 class sealed 只是说它不能来自 inherited;它并没有说明 access 本身。

来自 MSDN 文档:

When applied to a class, the sealed modifier prevents other classes from inheriting from it.

这意味着您仍然可以提供 public class that is sealed。但是,如果您尝试从 sealed class 继承,您将收到如下编译器错误:

cannot derive from sealed type 'YourNamespace.YourSealedClass'.


此外,我建议您阅读 this and this 关于 internal/public 和嵌套 classes.

现在,查看您提供的代码,弹出以下编译器错误:

FooType.FeeType1': cannot declare instance members in a static class

此错误意味着如果 class 声明为静态,则所有成员也必须是静态的。

FooType.FeeType1' is a 'property' but is used like a 'type'

这是因为 class 是静态的,但 none 的成员是静态的。

Inconsistent accessibility: parameter type 'FooType.FeeType' is less accessible than method 'IWebApp.RouteOneBuilder(FooType.FeeType)'

return 类型和方法的形式参数列表中引用的每个类型必须至少与方法本身一样可访问。

您可以找到有关最后一个错误的更多信息 here

设计不正确。

如果一个类型被标记为 internal,这表明永远不应在其 DLL 之外访问它。如果必须在声明它的 DLL 外部访问此类型,则不应将其标记为 internal.

什么约束阻止您使用 public 修饰符或将类型包含在与使用代码相同的 DLL 中?

在某些情况下,外部 DLL 或 EXE 查看在另一个 DLL 中声明的 internal 成员很有用。一个值得注意的案例是单元测试。被测代码可能具有 internal 访问修饰符,但您的测试 DLL 仍需要访问该代码才能对其进行测试。您可以将以下内容添加到包含 internal 成员的项目的 AssemblyInfo.cs 以允许外部访问。

[assembly:InternalsVisibleTo("Friend1a")]

有关详细信息,请参阅 InternalsVisibleToAttribute Class

旁注:sealed 访问修饰符不会阻止来自声明 DLL 外部的访问。它防止其他类型扩展类型。