C# 无法访问DLL之外的内部类&;某些公共变量不是';不可接近

C# 无法访问DLL之外的内部类&;某些公共变量不是';不可接近,c#,access-modifiers,C#,Access Modifiers,我很难做到这一点 这3个类FooType,WebApp和IWebApp在该DLL之外不能访问\可见。因此,密封的&内部的类就应运而生 我遇到的问题是 1) 在WebApp类中,FeeType1在RouteOneBuilder方法的参数中不可访问 2) 在WebApp类中,FeeType1在switch的case语句中不可访问\可见。(需要可见) 3) 在WebApp类中,FeeType1属性的CreditApplication在开关的case语句中不可见(需要可见) 有没有更好的方法来处理这个复

我很难做到这一点

这3个类
FooType
WebApp
IWebApp
在该DLL之外不能访问\可见。因此,
密封的
&
内部的
类就应运而生

我遇到的问题是

1) 在
WebApp
类中,
FeeType1
RouteOneBuilder
方法的参数中不可访问

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

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

有没有更好的方法来处理这个复杂的脚本?我是否已经因为在这个DLL之外公开类而完蛋了?第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);
}

您对
密封类的定义不正确。它不是像
公共
私有
受保护
内部
这样的访问修饰符。将类
标记为密封的
只表示它不能
继承自
;它没有说明访问本身的任何内容

从MSDN文档中:

当应用于一个类时,sealed修饰符会阻止其他类 从中继承

这意味着您仍然可以提供一个密封的
公共类。但是,如果尝试从
密封的
类继承,将收到如下编译器错误:

无法从密封类型“YourNamespace.YourSealedClass”派生


另外,我建议您阅读和了解内部/公共和嵌套类

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

FootType.FeeType1”:无法在静态类中声明实例成员

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

FooType.FeeType1'是一个“属性”,但与“类型”一样使用

这是因为类是静态的,但没有一个成员是静态的

可访问性不一致:参数类型“FooType.FeeType”较少 比方法“IWebApp.RouteOneBuilder(FootType.FeeType)”更容易访问

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


您可以找到有关上一个错误的详细信息。

您对
密封类的定义不正确。它不是像
公共
私有
受保护
内部
这样的访问修饰符。将类
标记为密封的
只表示它不能
继承自
;它没有说明访问本身的任何内容

从MSDN文档中:

当应用于一个类时,sealed修饰符会阻止其他类 从中继承

这意味着您仍然可以提供一个密封的
公共类。但是,如果尝试从
密封的
类继承,将收到如下编译器错误:

无法从密封类型“YourNamespace.YourSealedClass”派生


另外,我建议您阅读和了解内部/公共和嵌套类

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

FootType.FeeType1”:无法在静态类中声明实例成员

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

FooType.FeeType1'是一个“属性”,但与“类型”一样使用

这是因为类是静态的,但没有一个成员是静态的

可访问性不一致:参数类型“FooType.FeeType”较少 比方法“IWebApp.RouteOneBuilder(FootType.FeeType)”更容易访问

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


您可以找到有关上次错误的更多信息。

设计不正确

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

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

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

[assembly:InternalsVisibleTo("Friend1a")]
有关更多详细信息,请参阅


旁注:
sealed
access修饰符不阻止从声明的DLL外部进行访问。它阻止其他类型扩展该类型。

设计不正确

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

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

在某些情况下,外部DLL或EXE查看另一个DLL中声明的
内部
成员非常有用。一个值得注意的例子是单元测试。正在测试的代码可能是h