c#, наследовавший универсальный набор и сериализацию

Вам нужно будет ввести новый общий тип. Как только новый тип введен, вы можете устранить необходимость интерфейса.

public class UtilityThing<T, I> where T : Thing<I>, new()
{
    public T DoIt(SomeContext someContext, string name)
    {
        string contextVal = someContext.GetValue(name);

        var thing = new T { MyProperty = contextVal };
        return thing;
    }
}

И вы можете использовать его так:

var utility = new UtilityThing<IntThing, int?>();
6
задан Stécy 20 March 2009 в 13:06
поделиться

4 ответа

Это поведение "Дизайном". При получении из класса набора Xml Seralizier только сериализирует элементы набора. Для работы вокруг этого, необходимо создать класс, который инкапсулирует набор и имя, и сериализируйте это.

class Wrapper
{
    private Collection<Item> _items;
    private string _name;

    public Collection<Item> Items { get {return _items; } set { _items = value; } }
    public string Name { get { return _name; } set { _name = value; } }
}

Детальное обсуждение доступно здесь: http://blogs.vertigo.com/personal/chris/Blog/archive/2008/02/01/xml-serializing-a-derived-collection.aspx

12
ответ дан 8 December 2019 в 13:02
поделиться

XmlSerializer является злым. Тем не менее любой объект, который реализует IEnumerable, будет сериализирован как простой набор, игнорируя любые дополнительные свойства, которые Вы добавили сами.

Необходимо будет создать новый класс, который содержит и свойство и свойство, которое возвращает набор.

4
ответ дан 8 December 2019 в 13:02
поделиться

Можно также попробовать к implelemnt собственную сериализацию с помощью интерфейса IXmlSerializable

    public class ItemCollection : Collection<Item>,IXmlSerializable
    {
        private string _name;

        public ItemCollection()
        {
            _name = string.Empty;
        }

        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

 #region IXmlSerializable Members

         public System.Xml.Schema.XmlSchema GetSchema()
         {
              return null;
         }

         public void ReadXml(System.Xml.XmlReader reader)
         {

         }

         public void WriteXml(System.Xml.XmlWriter writer)
         {
              writer.WriteElementString("name", _name);
              List<Item> coll = new List<Item>(this.Items);
              XmlSerializer serializer = new XmlSerializer(coll.GetType());
              serializer.Serialize(writer, coll);

         }

#endregion
   }

Выше кода генерирует сериализированный xml как

<?xml version="1.0"?>
<ItemCollection>
  <name />
  <ArrayOfItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Item>
      <Value>1</Value>
    </Item>
    <Item>
      <Value>2</Value>
    </Item>
  </ArrayOfItem>
</ItemCollection>
0
ответ дан 8 December 2019 в 13:02
поделиться

Я не уверен, что я что-то упускаю, но хотите ли вы, чтобы полученный xml был

<ItemCollection>
   <Name>name val</Name>
   <Item>
      <Value>1</alue>
   </Item
   <Item>
      <Value>2</alue>
   </Item
</ItemCollection>

Если да , просто примените атрибут XmlRoot к классу itemcollection и задайте имя элемента ...

[XmlRoot(ElementName="ItemCollection")]
public class ItemCollection : Collection<Item>
{
   [XmlElement(ElementName="Name")]
   public string Name {get;set;}
}

Это даст указание сериализатору вывести требуемое имя для вашего контейнера коллекции.

2
ответ дан 8 December 2019 в 13:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: