2009-12-03 6 views
2

J'ai un tas de classes sérialisées stockées (qui héritent toutes d'une classe de base) en C#. En plus de la classe sérialisée, je stocke également une valeur enum qui identifie la sous-classe which sérialisée.Activer le type de classe en C#

Cela signifie que chaque fois que je veux sérialiser/désérialiser la classe, je dois utiliser quelques grandes instructions de commutation basées sur l'énumération pour décider de la sous-classe à désérialiser. Il semble qu'il y aurait un moyen de le faire en utilisant une sorte de chose structurelle. (Son pour un widget/tableau de bord, il est donc tout à fait possible que beaucoup plus de sous-classes apparaîtront dans le futur).

En ce moment, ça ressemble à ça ...

widget = DeserializeFromDb(GetWidgetType(widgetrow.WidgetType), widgetRow.serializedWidget); 

    private HtmlWidget DeserializeFromDb(WidgetType type, string serialized) 
    { 
     Basics.Serial.IStringSerializer serializer = Basics.Serial.BinarySerializer.GetInstance(); 

     switch (type) 
     { 
      case WidgetType.AbstractBase: 
       return serializer.Deserialize<HtmlWidget>(serialized); 
       break; 
      case WidgetType.Widget1: 
       return serializer.Deserialize<Widget1>(serialized); 
       break; 
      case WidgetType.Widget2: 
       return serializer.Deserialize<Widget2>(serialized); 
       break; 
     } 
    } 

Répondre

6

Vous pouvez mapper les valeurs enum à Func<ISerializer, string, HtmlWidget> délégués:

static Dictionary<WidgetType, Func<ISerializer, string, HtmlWidget>> map = 
    new Dictionary<WidgetType, Func<ISerializer, string, HtmlWidget>> { 
     { WidgetType.AbstractBase, (s, o) => s.Deserialize<HtmlWidget>(o) }, 
     { WidgetType.Widget1, (s, o) => s.Deserialize<Widget1>(o) }, 
    // ... 
}; 

// use it like: 
return map[type](serializer, serialized); 
Questions connexes