2017-08-11 187 views
0

我很难完成这项工作。无法访问DLL以外的内部类并且某些公共变量无法访问

3个类别FooTypeWebApp & IWebApp不能在此DLL外部可见\ \可见。所以,因此,类别为sealed & internal类别。我有

问题是...

1)在WebApp类,FeeType1RouteOneBuilder方法的参数进行访问。

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

3)在WebApp类中,CreditApplicationFeeType1属性在交换机的case-statement(需要可见)中不可见。

有没有更好的方法来处理这个复杂的脚本?我已经搞砸了暴露此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); 
} 
+0

那么,所有这些类和接口在同一个源文件? –

+0

3个独立的CS文件,但都在同一个项目文件(1个DLL文件)。 – fletchsod

+0

那么命名空间呢?在相同的命名空间或不同的命名空间中? –

回答

1

您对sealed类的定义不正确。它不是访问修饰符,如public,private,protectedinternal。标记一个类sealed只表示它不能是inherited;它本身没有说任何关于访问的东西。

从MSDN文档:

当施加到一个类时,密封改性剂防止其他类 从它继承。

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

不能从密封型“YourNamespace.YourSealedClass”派生。


另外,我建议你阅读thisthis关于内部/公共和嵌套类。现在

,看你提供的代码,下面的编译器错误弹出:

FooType.FeeType1' :不能在静态类实例成员声明

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

FooType.FeeType1' 是‘属性’,但使用像‘类型’

这源于以下事实类是静态的,但没有成员是。

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

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

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

0

设计不正确。

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

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

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

[assembly:InternalsVisibleTo("Friend1a")] 

查看InternalsVisibleToAttribute Class了解更多详情。

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