2011-04-08 97 views
2

我需要声明一个内部受保护的成员。然而,对于我完全的困惑,我刚刚发现了“保护内部”实际上意味着受保护或内部的困难方式。是否有任何访问修饰符,意味着内部保护C#的“受保护内部”是指“受保护”*或*“内部”。任何关键字是否意味着“受保护”*和*“内部”?

+0

@罗兰肖:我无法显示它。它是专有代码。哦,还有,你不想看到我正在制作的巨大的元编程混乱。 – pyon 2011-04-08 14:16:00

+2

一般情况下'内部'就足够了,除非出于任何原因你允许随机的人为你的程序集添加类。 – Powerlord 2011-04-08 14:16:25

+0

@R。 Bemrose:我知道,我知道。但是这相当于**不必要**牺牲了面向组件的一致性的面向对象的一致性。基本上,你说的是这样的话:“谁会关心我的程序集的内部设计的内部一致性,如果它对外界来说是一个黑盒子?” – pyon 2011-04-08 14:19:52

回答

6

虽然CLR supports it支持,在C#中有没有办法迫使一员是保护和内部。

C#和VB.NET都使用联合而不是交集来结合访问修饰符。

如果你绝对必须拥有它,有一个解决方法。它不干净,但它工作。您可以创建一个带有内部属性的助手类,然后将该内部类类型的受保护属性添加到您的类中。受保护属性的内部属性只能在拥有程序集中的子类上访问。

示例如下。我已经使用过泛型,因为您可能需要多个受保护的不同类型的内部属性。通用将允许您使用一个内部类而不管所需的属性类型。

public class AccessHelper<T> 
{ 
    internal T Value { get; set; } 
} 

public class AClass 
{ 
    public AClass() 
    { 
     InternalProperty.Value = "Can't get or set this unless you're a derived class inside this assembly."; 
    } 

    protected AccessHelper<String> InternalProperty 
    { 
     get; 
     set; 
    } 
} 
+0

我想要声明为受保护的成员和内部成员的类型甚至不能在程序集外部访问。因此,您的解决方法不起作用。 – pyon 2011-04-08 14:48:51

+0

它会起作用,除非你还没有提到的其他事情。严重的是,试试看。如果它不起作用,请告诉我为什么。它应该工作。在我的示例中,属性InternalProperty将在程序集外部可见,但不是该属性的Value属性,因为值是内部值。这就是存储你想要保护的实际值和内部的地方。 – 2011-04-08 14:51:12

+0

对不起,现在我得到你的建议。但这是一件非常丑陋的事情。无论谁去维护我的项目,都会找到我并刺死我。 (此外,我需要一个'AccessHelper '每个类需要伪造受保护的内部成员。) – pyon 2011-04-08 15:04:04

6

受保护的AND内部在C#(或任何其他高级.NET语言afaik)中不可用。虽然它得到了CLR的支持,并且可以在IL中实现。

0

内部类和受保护的成员如何?

+0

该类必须是公开的。 – pyon 2011-04-08 14:16:28

+0

您可以使用属性将Visiblity设置为确定。DLL,但我认为你选择了错误的模式。继承使用复合模式或Visitor。 – 2011-04-08 14:58:18

3

从Equiso的链接举例:

BTW的CLR确实有ProtectedANDInternal的概念,但是C#有没有语法来指定。如果您查看CLR的System.Reflection.MethodAttributes枚举,您将看到FamANDAssem和FamORAssem(“Family”是C#的CLR术语,“Assem”是C#的内部)。