Создание анонимного объекта с помощью отражения в C#

StackOverflow https://stackoverflow.com/questions/114010

Вопрос

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

object anon = create(existingAnonymousType);

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

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

Ответ на актуальный вопрос:Я обнаружил, что генерация кода C#, а затем использование CodeDomProvider (но не самого CodeDOM — ужасно), а затем его компиляция и отражение типов на его основе — это самый простой способ создания «анонимных» объектов во время выполнения.

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top