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
  • 17,349
  • 20
  • 91
  • 115
  • 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,488
  • 5
  • 32
  • 37
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,516
  • 2
  • 21
  • 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,493
  • 1
  • 15
  • 19