Создание анонимного объекта с помощью отражения в C#
-
02-07-2019 - |
Вопрос
Есть ли способ создать анонимный объект С# 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.