2013-09-19 5 views
0

позволяет начать эту нить с кучей предположений:
первого предположения: у нас есть библиотека (* .dll), который содержит следующий код:сериализации производные (неизвестные) типы

class Program { 
    static void Main(string[] args) { 
     XmlSerializer ser = new XmlSerializer(typeof(Foo)); 
    } 
} 

public class Foo { public string name;} 

второе предположение: мы получил класс, который происходит от Foo, давайте назовем его Bar.

public class Bar : Foo { } 

Этот класс расположен за пределами библиотеки.

Теперь наступает волшебство: класс Bar загружается через Reflection, поэтому мы не знаем его существования во время компиляции. Также XmlSerializer ничего не знает о производном классе, и поскольку мы находимся в совершенно другой библиотеке, мы не можем просто добавить XmlInclude, потому что мы не можем изменить код класса Foo. Итак, есть ли способ использовать существующий XmlSerializer на экземпляре класса Bar (я знаю, что по текущей реализации ser не будет вообще видимым для любого внешнего кода, но позволяет отложить это и предположить, что мы МОЖЕТ получить доступ сериализатор из класса Bar)?

Может ли это быть достигнуто путем использования атрибутов к классу Bar ([System.Xml.Serialization ...] перед определением класса)?

ответ

0

Предполагая, что эти ограничения существуют для wierd причинам и что вашему XmlSerializer нужен аргумент типа, тогда вам нужно получить тип времени выполнения аргумента.

var barInstance = However().You().Reflect().To().Get().Bar(); 

// The runtime type 
var barType = barInstance.GetType(); 

var ser = XmlSerializer(barType); 

TypeOf (T) получает тип во время компиляции, но, так как у вас нет доступа к этому, вы будете нуждаться в Obj.GetType();

+0

Спасибо за ответ. Но, как я уже указывал, Сериализатор, который я хочу использовать, уже существует в библиотеке. Сказав это, я не могу повторно объявить его с новым типом-атрибутом. – HimBromBeere

+0

Вы уже передаете его во время выполнения: Foo. typeof просто генерирует аргумент во время компиляции, XmlSerializer все еще создается во время выполнения с этим аргументом типа. Вам нужно будет использовать GetType(), чтобы получить тип времени выполнения. –

Смежные вопросы