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