Quiero hacerlo como una variable (llamémosla Foo) que solo se puede modificar dentro del ensamblado pero que puede ser accedida por cualquier clase secundaria, incluso fuera del ensamblado. Así que quiero tener un conjunto interno y una obtención protegida:
Haciendo protected int Foo { internal set; get; } me dice esto que el conjunto debe ser mas restrictivo que la propiedad o indexador Pero internal int Foo { set; protected get; } me dice lo mismo para el get
¿Cómo puedo solucionar eso?
Puede crear un método interno (o una propiedad de proxy) para llamar al conjunto.
protected int Foo { internal set; get; } internal void SetFoo(int foo) { Foo = foo; }En este caso, puede configurar el setter de Foo como private .
Tenga en cuenta que esto permite que cualquier cosa en su ensamblaje que tenga una referencia a este objeto pueda llamar a SetFoo , que puede no ser lo que desea.
Uso internal para el colocador e protected internal para toda la propiedad.
public class X { // Read from this assembly OR child classes // Write from this assembly protected internal int Foo { internal set; get; } } El nombre protected internal es un poco engañoso, pero hace lo que quieres lograr:
Se puede acceder a un miembro interno protegido desde el ensamblado actual o desde los tipos que se derivan de la clase contenedora.
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/protected-internal
Entonces, debido a que el establecedor es internal , puede establecer la propiedad desde cualquier lugar en el mismo ensamblaje pero no desde un ensamblaje diferente. Y debido a que la propiedad en su conjunto está protected internal , puede leerla desde cualquier lugar en el mismo ensamblaje O desde clases secundarias en cualquier ensamblaje.
Otro enfoque:
public class X { // Read from child classes // Write only from child classes in the same assembly protected int Foo { private protected set; get; } }Los tipos derivados de la clase contenedora pueden acceder a un miembro protegido privado, pero solo dentro de su ensamblaje contenedor.
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/private-protected