Предоставлено класс и подклассМожет родовое коллекция предотвратить добавление производных объектов
public class Base
{
public string Name { get; set; }
}
public class Derived : Base
{
public string Extra {get; set; }
}
и общий список
var list = new List<Base>();
Я хочу, чтобы предотвратить это:
var b = new Base { Name = "base" };
var d = new Derived { Name = "derived", Extra = "stuff" };
list.Add(b); // this is good
list.Add(d); // this is BAD
Причиной для предотвращения этого является список, который будет сериализован таким образом, который теряет информацию о типе, затем ресериализуется до List<Base>
. Любые элементы, получаемые frome Base
, потребуют downcasting для типа, неизвестного десериализатором (я, конечно, не хочу использовать отражение, чтобы найти класс, который наследует от Base и имеет свойство «Extra»). Возможно, я буду бороться с подходами, чтобы решить это, и это может привести к другому вопросу. Но на данный момент я могу избежать проблемы, не добавляя добавленные производные объекты в общий список?
Они _may_ будут полезны ... Как поместить разрозненные объекты в список и сериализовать/десериализовать их и сохранить всю информацию о типе: https://weblogs.asp.net/stevewellens/serializing-arraylists-of-disparate-objects -to-xml-strings –
Даже если бы вы могли, вы не должны: http://en.wikipedia.org/wiki/Liskov_substitution_principle – Mephy
@Mephy: если я понимаю, как здесь применяется Лисков, возможно, ответ заключается в том, чтобы опрокинуть любые производные объекты, которые были добавлены до сериализации. В этом примере это разделило бы «Экстра». Тогда десериализация будет видеть только единый список. Это имеет большой смысл. – biscuit314