1

On a public class in C# is there a way to make a field/method accessible only to derived classes within the same assembly?

From what I understand protected internal in C# means the same as protected or internal (ie accessible to derived classes or classes from the same assembly), which is not what I need.

pauldoo
  • 18,087
  • 20
  • 94
  • 116
  • C# does not support that, according to [MSDN](http://msdn.microsoft.com/en-us/library/system.reflection.methodbase.isfamilyandassembly.aspx): _Methods with this visibility cannot be defined in Visual Basic or C#._ – Jeppe Stig Nielsen Jul 01 '12 at 08:00

3 Answers3

3

What if you removed the "internal" only fields/methods from the public class to an internal class. Then all of the classes in that assembly could derive from the internal class:

public abstract class MyClass
{
    public string Name { get; set; }
}

// Only classes in this assembly can derive from this class
internal abstract class InternalClass : MyClass
{
    protected string Other { get; set; }
}
MrDustpan
  • 5,508
  • 6
  • 34
  • 39
1

You can't prevent a class from an external assembly from compiling a call to it, but you can force an exception to occur at runtime if they do by putting this attribute on your protected member:

   [System.Security.Permissions.StrongNameIdentityPermission(
    System.Security.Permissions.SecurityAction.LinkDemand, 
    PublicKey = "...<Your assembly's full public key>...")]
Mike Dour
  • 3,616
  • 2
  • 22
  • 24
1

If the class is internal, there will be no way to sub-class it outside of the assembly. Make the fields/methods protected and you're good to go.

If the class must be public, use an internal sub-class everywhere within your assembly.

TreDubZedd
  • 2,571
  • 1
  • 15
  • 20