2013-07-24 4 views
1

Во время выполнения, я считаю, тип объекта, из которого я хочу, чтобы создать экземпляр:Присвоить динамически десериализован значение динамически создается экземпляр

string typeName = "myNamespace.type, assembly"; 
Type theType = Type.GetType(typeName); 
// the type features a constructor w/o arguments: 
object theInstance = Acivator.CreateInstance(theType); 

Это прекрасно работает и в отладчике я могу видеть все значения атрибутов - Я полагаю, что отладчик использует отражение?

У меня также есть динамически десериализованное объект типа объекта, для которого я знаю, что это на самом деле типа theType:

// pseudo code on the rhs of the "=" 
object deserialized = decoder.decode(serializedObject.body); 

Есть ли способ, чтобы назначить deserialized к theInstance, без зацикливания над атрибутами тип с использованием отражения? Поскольку это будет критическим для времени: если единственный способ сделать это - это отражение, есть ли способ минимизировать штраф за производительность? Я ожидаю многие из этих объектов за короткое время.

(Это .Net 3.5, поэтому, если Type dynamic может решить это, это бесполезно в этом случае).

+0

Звучит как работа для генериков – asawyer

+0

Зачем вам нужно создать экземпляр объекта перед десериализацией другого? Почему вы не можете использовать десериализованный объект вместо копирования его атрибутов на другой объект? – cdhowie

+0

Я думаю, что это будет вниз, и это запрещено в C#. Поправьте меня, если я ошибаюсь. –

ответ

0

Самый простой способ будет написать метод, который копирует атрибуты одного объекта этого типа к другому:

static void CopyAttributesOnto(theType dest, theType source) 
{ 
    dest.a = source.a; 
    dest.b = source.b; 
    // ... 
} 

// Then you can just do this: 
CopyAttributesOnto((theType)theInstance, (theType)deserialized); 

Другим вариантом было бы построить DynamicMethod во время выполнения и создать делегат от него. Вы заплатите один раз за стоимость отражения и компиляцию JIT нового метода, но при каждом вызове метода не будет больше накладных расходов, чем использование любого другого делегата.

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