Ответ 1
Вот еще один способ, кажется более прямым.
object anon = Activator.CreateInstance(existingObject.GetType());
Есть ли способ создать анонимный объект С# 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 для конструктора.
Edit: Спасибо Sklivvz за указание, что я ответил на вопрос, который не был задан;)
Ответ на реальный вопрос: я обнаружил, что генерирую код С#, а затем используя CodeDomProvider (но не сам CodeDOM - ужасный), а затем компилирование этого и отражения типов из этого - самый простой способ сделать анонимный 'объекты во время выполнения.
Возможно, вы захотите изучить DLR. Я не сделал этого сам (пока), но прецедент для DLR (динамические языки) звучит так же, как то, что вы пытаетесь сделать.
В зависимости от того, что вы хотите сделать, динамический прокси-объект Castle-framework тоже может быть хорошим.
Вы можете использовать Reflection.Emit для генерации требуемых классов динамически, хотя это довольно неприятно для кода.
Если вы решите этот маршрут, я бы предложил загрузить Reflection Emit Language Addin для .NET Reflector, так как это позволяет вам увидеть, как существующие классы будут построены с использованием Reflection.Emit, следовательно, хороший метод для изучения этого угла рамки.
Вам также может понадобиться изучить класс FormatterServices: Запись MSDN в FormatterServices
Он содержит GetSafeUninitializedObject, который будет создавать пустой экземпляр класса и несколько других удобных методов при сериализации.
В ответ на комментарий Майкла: Если у вас нет экземпляра Type для типа T, вы всегда можете получить его из typeof (T). Если у вас есть объект неизвестного типа, вы можете вызвать GetType() на нем, чтобы получить экземпляр Type.