Necesito una clase para modificar la propiedad de varias otras clases. Entonces, de alguna manera necesito delegar o vincular la propiedad a la clase de modificación. Esta es una maqueta de cómo se organizan las clases.
MainClassA IHasAmount int Amount Price Goodstype MainClassB IHasAmount int Amount Quality Weight IHasAmount int Amount get; set; AmountModifierClass IHasAmount HasAmountDe esta manera, la cantidad se modificaría así:
HasAmount.Amount -= AmountModifier();Es solo un pequeño detalle que me molesta que el nombre se vuelva redundante. Me gustaría poder escribirlo solo como una propiedad o campo. Así que pruebo con esto:
UN)
int Amount=> HasAmount.AmountPero eso no funciona porque se convierte en solo lectura. Así que asumo que no está apuntando también a la propiedad Cantidad original, sino que es un captador, sin un definidor. Así que intento lo siguiente:
B)
int Amount { get { return HasAmount.Amount; } set { HasAmount.Amount = value; }}¡Y esto funciona! Ahora puedo usar una propiedad privada de la clase AmountModifier que está vinculada a la propiedad Amount de MainClass, como Health = HealthModifer
Mi pregunta es si esta es una manera eficiente y no compleja de resolver esta situación. Supongo que lo que necesito es poder vincular una propiedad a otra en otra clase.
No hay forma de que una propiedad se delegue automáticamente a otra propiedad mediante funciones exclusivas del lenguaje C#.
La forma en que lo he logrado es creando un objeto detrás de cada propiedad, por lo que la propiedad termina luciendo más o menos así:
int Amount { get => GetPropertyValue(); set => SetPropertyValue( value ); } Los GetPropertyValue() y SetPropertyValue() reciben el nombre de la propiedad ("Cantidad") utilizando el atributo CallerMemberName . Internamente, buscan un objeto de propiedad por nombre en un diccionario que asigna nombres a objetos de propiedad y obtienen o establecen el valor de ese objeto de propiedad.
Entonces, la delegación se puede lograr de la siguiente manera:
int AmountOfOtherObject { get => GetDelegatingPropertyValue( otherObject, nameof( otherObject.Amount ) ); set => SetDelegatingPropertyValue( otherObject, nameof( otherObject.Amount ), value ); } Los GetDelegatingPropertyValue() y SetDelegatingPropertyValue() un tipo especial de propiedad en el mismo diccionario, que es una propiedad de delegación que delega a la propiedad correspondiente del "otro" objeto.
Termina siendo un poco más detallado de lo que desearía, y también requiere un soporte de infraestructura sustancial. Si intenta implementar esto, prepárese para una inmersión profunda en una larga madriguera de conejo.
ver propiedades
// This one indeed is a getter-only int Amount => HasAmount.Amount;y
int Amount { get => HasAmount.Amount; }y
int Amount { get { return HasAmount.Amount; } }Son solo formas diferentes de escribir exactamente lo mismo.
Entonces, en su caso, su solución de trabajo
int Amount { get { return HasAmount.Amount; } set { HasAmount.Amount = value; } }también se puede escribir como
int Amount { get => HasAmount.Amount; set => HasAmount.Amount = value; } Entonces, si no desea exponer la referencia HasAmount esta es una forma totalmente válida de implementar dicha propiedad y no veo un problema con la eficiencia.