Создание анонимного объекта с помощью Reflection in С#

Есть ли способ создать анонимный объект С# 3.0 через Reflection во время выполнения в .NET 3.5? Я хотел бы поддержать их в моей схеме сериализации, поэтому мне нужен способ их программного программирования.

отредактирован позже, чтобы прояснить вариант использования

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

Ответ 1

Вот еще один способ, кажется более прямым.

object anon = Activator.CreateInstance(existingObject.GetType());

Ответ 2

Да, есть. Из памяти:

public static T create<T>(T t)
{
    return Activator.CreateInstance<T>();
}

object anon = create(existingAnonymousType);

Ответ 3

Используйте отражение, чтобы получить тип, используйте GetConstructor для типа, используйте Invoke для конструктора.

Edit: Спасибо Sklivvz за указание, что я ответил на вопрос, который не был задан;)

Ответ на реальный вопрос: я обнаружил, что генерирую код С#, а затем используя CodeDomProvider (но не сам CodeDOM - ужасный), а затем компилирование этого и отражения типов из этого - самый простой способ сделать анонимный 'объекты во время выполнения.

Ответ 4

Возможно, вы захотите изучить DLR. Я не сделал этого сам (пока), но прецедент для DLR (динамические языки) звучит так же, как то, что вы пытаетесь сделать.

В зависимости от того, что вы хотите сделать, динамический прокси-объект Castle-framework тоже может быть хорошим.

Ответ 5

Вы можете использовать Reflection.Emit для генерации требуемых классов динамически, хотя это довольно неприятно для кода.

Если вы решите этот маршрут, я бы предложил загрузить Reflection Emit Language Addin для .NET Reflector, так как это позволяет вам увидеть, как существующие классы будут построены с использованием Reflection.Emit, следовательно, хороший метод для изучения этого угла рамки.

Ответ 6

Вам также может понадобиться изучить класс FormatterServices: Запись MSDN в FormatterServices

Он содержит GetSafeUninitializedObject, который будет создавать пустой экземпляр класса и несколько других удобных методов при сериализации.

В ответ на комментарий Майкла: Если у вас нет экземпляра Type для типа T, вы всегда можете получить его из typeof (T). Если у вас есть объект неизвестного типа, вы можете вызвать GetType() на нем, чтобы получить экземпляр Type.