在C#中打开类类型

use*_*982 2 c# serialization

我在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;
       }
  }
Run Code Online (Sandbox Code Playgroud)

Meh*_*ari 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);
Run Code Online (Sandbox Code Playgroud)