Как создать экземпляр класса обходным путем?
От: Егорыч  
Дата: 24.01.07 12:26
Оценка:
Привет!

Есть ли в NET 2.0 какой-нибудь способ создать экземпляр класса, который:

Пример класса — SyncArrayList, который объявлен внутри ArrayList и возвращается следующим вызовом:

ArrayList.Synchronized(new ArrayList())

Вопрос такой возникает в контексте написания сериализатора/десериализатора классов в/из XML (подобного Java'вскому XStream).

Пока что только смог написать билдер, который создает динамический тип, наследующий нужный класс, эмиттит конструктор и создает экземпляр прокси. Но такой способ имеет два недостатка:

В Java'вском XStream'е для этого применен способ, который использьзуется самой Java-машиной в механизме сериализации. Может механизм NET тожно можно для этого применить? У меня пока есть только одна шальная идея — для нужного класса создать его бинарное сериализованное представление (не содержащее значений полей) в массиве байт и десериализовать его из этого массива. Что скажете, гуру, может такой способ прокатить? Или с классом, у которого не стоит атрибут [Serializable], такое не пройдет?

Может какие другие идеи подскажете?
Re: Как создать экземпляр класса обходным путем?
От: nikov США http://www.linkedin.com/in/nikov
Дата: 24.01.07 12:36
Оценка: 14 (3) +2
Здравствуйте, Егорыч, Вы писали:


System.Runtime.Serialization.FormatterServices.GetUninitializedObject(typeof(TypeWithoutPublicCtor))
Re: Как создать экземпляр класса обходным путем?
От: GlebZ Россия  
Дата: 24.01.07 12:39
Оценка:
Здравствуйте, Егорыч, Вы писали:

Е>Может какие другие идеи подскажете?

В простейшем случае это будет последовательный вызов Type.GetConstructor и ConstructorInfo.Invoke.
Можно и эмитить, будет быстрее — но все таки значительно сложнее.
Re[2]: Как создать экземпляр класса обходным путем?
От: Saruwatari Россия  
Дата: 25.01.07 11:52
Оценка:
Здравствуйте, GlebZ, Вы писали:

GZ>Здравствуйте, Егорыч, Вы писали:


Е>>Может какие другие идеи подскажете?

GZ>В простейшем случае это будет последовательный вызов Type.GetConstructor и ConstructorInfo.Invoke.
GZ>Можно и эмитить, будет быстрее — но все таки значительно сложнее.

Type Activator.CreateInstance(...)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.