2010-02-16 6 views
0

Je voudrais sérialiser les propriétés de l'objet HttpBrowserCapibilities afin qu'il puisse être renvoyé via un appel de méthode web. Actuellement, l'objet ne peut pas être sérialisé:Comment créer une copie superficielle d'un objet afin qu'il puisse être sérialisé et envoyé via un appel de méthode Web?

Cannot serialize member System.Web.Configuration.HttpCapabilitiesBase.Capabilities of type System.Collections.IDictionary, because it implements IDictionary. 

... ce qui est compréhensible. Cependant, je voudrais simplement copier les propriétés et leurs valeurs à une hiérarchie, à savoir

<HttpBrowserCapabilities> 
    <IsMobile>true</IsMobile> 
</HttpBrowserCapabilities> 

Je commence à penser que je aurais besoin d'utiliser la réflexion pour copier cet objet, mais je ne l'ai pas atteint un conclusion. Quelqu'un at-il des suggestions pour garder cela simple?

Merci, George

Répondre

2

Au départ, je posté une réponse à l'aide XmlDocument, mais je passé sous silence certaines des choses de la méthode web et ne se rendent pas compte que vous essayez vraiment de mapper un DTO. La réflexion semble compliquée mais elle ne l'est pas vraiment. L'extrait suivant fera ce que vous voulez:

public static void Populate(object dest, IDictionary dictionary) 
{ 
    Type t = dest.GetType(); 
    foreach (object key in dictionary) 
    { 
     PropertyInfo prop = t.GetProperty(key.ToString(), 
      BindingFlags.Instance | BindingFlags.Public); 
     if ((prop != null) && prop.CanWrite) 
     { 
      object value = dictionary[key]; 
      prop.SetValue(dest, value, null); 
     } 
    } 
} 

Puis invoquez cela comme:

BrowserCapsDto dto = new BrowserCapsDto(); 
Populate(dto, Capabilities); // Capabilities is the real BrowserCaps 

Il est assez facile parce que vous avez déjà un IDictionary et donc vous savez déjà tous les noms possibles que vous pouvez mapper ; vous n'avez pas besoin d'utiliser de réflexion sur la source, juste la destination.

Questions connexes