Создать анонимный объект с помощью Reflection в C # - PullRequest
10 голосов
/ 22 сентября 2008

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

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

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

Ответы [ 6 ]

3 голосов
/ 25 сентября 2008

Вот другой способ, кажется более прямым.

object anon = Activator.CreateInstance(existingObject.GetType());
3 голосов
/ 22 сентября 2008

Да, есть. По памяти:

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

object anon = create(existingAnonymousType);
1 голос
/ 23 сентября 2008

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

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

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

1 голос
/ 22 сентября 2008

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

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

1 голос
/ 22 сентября 2008

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

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

1 голос
/ 22 сентября 2008

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

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

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

...