2009-12-03 75 views
2

我在C#中有一堆存儲的,序列化的類(都是從基類繼承的)。與序列化類一起,我還存儲了一個枚舉值,用於標識哪個子類被序列化。在C#中切換類的類型

這意味着無論何時我想序列化/反序列化類,我都必須使用一些基於枚舉的大開關語句來決定要反序列化的子類。似乎有一種方法可以使用某種類似結構圖的東西來實現它。 (它用於小部件/儀表板,因此將來可能會出現更多的子類)。

現在,它看起來像這樣...

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; 
     } 
    } 

回答

6

可以映射枚舉值Func<ISerializer, string, HtmlWidget>代表:

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);