Продолжаю разрабатывать тему сериализации и десериализации объектов.
Подскажите, пожалуйста — возможно ли "доконструировать" объект после его создания посредством вызова GetUninitializedObject?
То бишь вызвать конструктор (именно конструктор!) с параметром, после создания экземпляра объекта?
Пожалуйста, обратите внимание, что речь идёт только о вызове конструктора. Вызов помеченного специальным аттрибутом метода Initialize не рассматривается. Решается конкретная задача. Спасибо!
Здравствуйте, LWhisper, Вы писали:
LW>Подскажите, пожалуйста — возможно ли "доконструировать" объект после его создания посредством вызова GetUninitializedObject? LW>То бишь вызвать конструктор (именно конструктор!) с параметром, после создания экземпляра объекта?
В валидном IL — нет. Точнее, можно, но для этого надо не извращаться, а просто сделать пару .newobj + .ret.
В невалидном — просто сгенерить вызов конструктора на положенном в стек объекте. Если повезёт — рантайм пропустит. Но я бы на это не закладывался.
Re[2]: Вызов конструктора после GetUninitializedObject
Здравствуйте, Sinix, Вы писали:
S>В валидном IL — нет. Точнее, можно, но для этого надо не извращаться, а просто сделать пару .newobj + .ret.
Очень жаль, спасибо.
S>В невалидном — просто сгенерить вызов конструктора на положенном в стек объекте. Если повезёт — рантайм пропустит. Но я бы на это не закладывался.
Заманчиво, но завязываться действительно не стоит. Возьму на заметку, вдруг когда пригодится.
Re: Вызов конструктора после GetUninitializedObject
using System;
using System.Runtime.Serialization;
namespace ConsoleApplication1
{
class A
{
public A(string param)
{
Console.WriteLine(param);
}
}
class Program
{
static void Main(string[] args)
{
var a = (A)FormatterServices.GetUninitializedObject(typeof(A));
var ctor = typeof(A).GetConstructor(new[] { typeof(string) });
ctor.Invoke(a, new[] { "123" });
}
}
}
Re[2]: Вызов конструктора после GetUninitializedObject
D>using System;
D>using System.Runtime.Serialization;
D>namespace ConsoleApplication1
D>{
D> class A
D> {
D> public A(string param)
D> {
D> Console.WriteLine(param);
D> }
D> }
D> class Program
D> {
D> static void Main(string[] args)
D> {
D> var a = (A)FormatterServices.GetUninitializedObject(typeof(A));
D> var ctor = typeof(A).GetConstructor(new[] { typeof(string) });
D> ctor.Invoke(a, new[] { "123" });
D> }
D> }
D>}
D>
Мне в любом случае придётся это кэшировать, заворачивать в Expression, и возвращать как лямбда-функции вида Func<object, object, ...>, но в любом случае — спасибо. :]