Memore dei "problemi" avuti in un recente passato da Igor
con la serializzazione della struttura Color, non mi sono stupito
più di tanto quando non ho trovato i membri R, G, e B di una mia proprietà di
tipo Color "dall'altra parte" di un Web Service...
Mi spiego meglio:
ho realizzato un semplice WebService (che dovrà essere obbligatoriamente
consumato da una applicazione .NET - Desktop e PocketPC), che espone una
classe, la quale contiene una proprietà,
TrasparentColor, di tipo Color per l'appunto.
Lato client, e per gli stessi motivi citati da Igor nel suo post, non vengono
ricostruite le proprietà che permettono di recuperare i valori delle componenti
RGB; di fatto la struttura ricreata appare senza alcuna proprietà.
Ho quindi realizzato un "wrapper":
using System;
using System.Drawing;
namespace MyApp
{
public struct MyColor
{
// Istanza di Color
private Color color;
// Getter e Setter per ottenere le componenti RGB
public int Red
{
get { return color.R; }
set { color = Color.FromArgb(value, color.G, color.R); }
}
public int Green
{
get { return color.G; }
set { color = Color.FromArgb(color.R, value, color.B); }
}
public int Blue
{
get { return color.B; }
set { color = Color.FromArgb(color.R, color.G, value); }
}
// Costruttori dalle singole componenti e da una istanza di Color
public RaDExColor(Color color)
{
this.color = color;
}
public RaDExColor(int red, int green, int blue)
{
color = Color.FromArgb(red, green, blue);
}
// Cast impliciti da e verso Color
static public implicit operator RaDExColor(Color value)
{
return new RaDExColor(value);
}
static public implicit operator Color(RaDExColor value)
{
return value.color;
}
// Implementazioni varie
public override string ToString()
{
return color.ToString();
}
public override int GetHashCode()
{
return color.GetHashCode();
}
public override bool Equals(object obj)
{
if(obj == null)
return false;
if(this.GetType() != obj.GetType())
return false;
RaDExColor other = (RaDExColor)obj;
if(!Object.Equals(color, other.color))
return false;
return true;
}
public static bool operator==(RaDExColor color1, RaDExColor color2)
{
return Object.Equals(color1, color2);
}
public static bool operator!=(RaDExColor color1, RaDExColor color2)
{
return !(color1 == color2);
}
}
}
Questa implementazione funziona benissimo ai miei scopi; l'unica cosa che nn
mi piace sono i setter, che ricreano ogni volta una nuova istanza di Color ad
ogni modifica di una componente.
powered by IMHO 1.3