无法访问DLL和Linux之外的内部类。某些公共变量无法访问

时间:2017-08-11 18:33:50

标签: c# access-modifiers

我很难完成这项工作。

3个班级FooTypeWebApp& IWebApp在此DLL之外不得为accessbile \ visible。因此,sealed& internal课程。

我遇到的问题是......

1)在WebApp班级中,FeeType1方法的参数无法访问RouteOneBuilder

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

3)在WebApp类中,CreditApplication属性的FeeType1在switch的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);
}

2 个答案:

答案 0 :(得分:1)

您对sealed类的定义不正确。它不是publicprivateprotectedinternal等访问修饰符。标记班级sealed只表示它不能来自inherited;它本身没有说明访问

来自MSDN文档:

  

当应用于类时,sealed修饰符会阻止其他类   继承自它。

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

  

无法从密封类型'YourNamespace.YourSealedClass'派生。

此外,我建议您阅读有关内部/公共和嵌套类的thisthis

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

  

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

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

  

FooType.FeeType1'是'property',但用作'type'

这是因为该类是静态的,但没有成员。

  

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

可访问

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

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

答案 1 :(得分:0)

设计不正确。

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

什么限制阻止您使用public修饰符或将相同的DLL中的类型包含在消费代码中?

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

[assembly:InternalsVisibleTo("Friend1a")]

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

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