2008-09-22 3 views
10

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

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

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

ответ

3

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

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

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

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

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

+0

Я думаю, что он имел в виду: если тип не объявлен – Sklivvz 2008-09-22 09:49:01

+0

Спасибо, это звучит возможно ... Тем не менее, будет ли это работа для SilverLight приложения? Не уверен, есть ли там файлы CodeDOM. – 2008-09-22 12:55:07

1

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

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

+0

Спасибо, звучит интересно. Однако, возможно, для меня нет, потому что я планирую использовать его в приложении Silverlight. – 2008-09-22 12:56:40

3

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

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

object anon = create(existingAnonymousType); 
+0

Спасибо, это выглядит как простой способ. Не очень простая вещь. – 2008-09-22 12:57:50

+0

Оглядываясь назад, это будет просто привязываться к типу времени компиляции existingAnonymousType, а не к типу времени выполнения, поскольку синтаксический сахар, исключающий общий параметр, является артефактом времени компиляции.Иными словами, если он определен как объект, вы создадите экземпляр объекта. – Guvante 2008-10-08 11:03:32

1

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

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

+0

Спасибо, это выполнимо, но, вероятно, это не сработает вместе с существующими анонимными классами, на которые я верю. – 2008-09-22 12:58:25

1

Вы также можете захотеть взглянуть в класс FormatterServices: MSDN entry on FormatterServices

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

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

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