2010-04-25 20 views
10

Estoy escribiendo un código que llenará las propiedades Margin, Padding y BorderThickness de las clases en el espacio de nombres System.Windows.Documents. Cada una de estas propiedades acepta un valor en forma de System.Windows.Thickness, que es una estructura.¿Existe una alternativa práctica a struct inheritance? (C#)

Sin embargo, deseo asociar algunos datos adicionales con cada una de estas asignaciones de propiedades, que posteriormente pueden ser recuperadas por mi código. Si Thickness fuera una clase, heredaría de ella y definiría las propiedades en la subclase para almacenar mis elementos de datos adicionales. Pero como es una estructura, la herencia no es posible.

¿Hay alguna forma práctica de lograr esto, mientras se mantiene la compatibilidad de tipos con las propiedades que estoy poblando?

Gracias por sus ideas,

Tim

Respuesta

9

No hay buenas alternativas.

Dependiendo de lo que intente hacer, tal vez pueda definir su propia clase con las propiedades que necesita, y defina el operador de conversión implícita para hacer una conversión implícita al tipo de estructura correcto. Luego, podría pasar en su clase a todos los métodos que esperan un parámetro de Grosor.

Esto iría en contra de la recomendación de utilizar el operador de conversión implícita, ya que establece que la conversión implícita no debe perder ninguna información. No podrá recuperar el grosor de la propiedad que está leyendo y verá la información adicional que adjuntó.

Esta es la forma en que podría ponerlo en práctica:

public class ThicknessEx 
{ 
    public string ExtraData { get; set; } 
    public Thickness Thickness { get; set; } 

    public static implicit operator Thickness(ThicknessEx rhs) 
    { 
     return rhs.Thickness; 
    } 
} 

Sin embargo, usted es probablemente mejor mediante el almacenamiento de los datos adicionales en otros lugares. Cómo hacerlo dependerá de sus necesidades y aplicación.

+0

Gracias por una solución muy innovadora. Como dices, casi funciona, pero como los datos adicionales no se pueden recuperar de las propiedades a las que fueron asignados, significa que debe estar duplicado en otro lugar, lo que es algo contraproducente. Intenté adaptar tu idea para trabajar con las propiedades de dependencia subyacentes, a través del método SetValue(), pero SetValue() realiza una verificación de tipo que parece ser un obstáculo para pasar algo excepto el tipo esperado. –

0

¿No podría almacenar un diccionario donde la clave es el código hash de la estructura?

+2

Eso dependería de si se requieren dos instancias de espesor iguales para tener el mismo valor en los datos adicionales, o no. – driis

+0

Hmm, buen punto. – AndrewVos

1

Puede utilizar Attached Dependency Properties del tipo AugmentedThickness y luego, cuando cambien, actualizar las propiedades subyacentes que están destinadas a actualizar. Esto requiere que todos los accesos se realicen utilizando sus Propiedades adjuntas, ya que el simple hecho de configurar la propiedad Grosor no usará su Grosor aumentado. Si es necesario, también podrías (aunque podría ser un poco malo) escuchar cambios explícitos a las propiedades de Grosor (que no iniciaste) y forzarlo de nuevo al valor especificado por tu AugmentedThickness.

Cuestiones relacionadas