2008-09-22 41 views
10

¿Hay alguna forma de crear un objeto anónimo C# 3.0 a través de Reflection en tiempo de ejecución en .NET 3.5? Me gustaría apoyarlos en mi esquema de serialización, así que necesito una forma de manipularlos programáticamente.Crear objeto anónimo por reflexión en C#

editado más tarde para aclarar el caso de uso

Una restricción adicional es que me va a correr todo ello dentro de una aplicación Silverlight, tiempos de ejecución de manera que el incremento no no son una opción, y está seguro de cómo la generación de código en el volar funcionará

Respuesta

3

He aquí otra manera, parece más directa.

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

..... Sí, o eso. – TraumaPony

+0

¿Qué sucede si desea crear un tipo que no sea el mismo que el objeto existente? –

+0

@ AlexHopeO'Connor: 'CreateInstance' toma un objeto' Type', por lo que puede pasar cualquier 'Type'. Por ejemplo 'Activator.CreateInstance (typeof (string))'. – Guvante

1

Use la reflexión para obtener el tipo, use GetConstructor en el tipo, use Invoke en el constructor.

Edit: Gracias a Sklivvz por señalar que respondí una pregunta que no se le pidió;)

La respuesta a la pregunta real: Me he dado cuenta que la generación de código C# y luego usando CodeDomProvider (pero no CodeDOM en sí - terrible) y luego compilarlo y reflejar los tipos de eso es la forma más fácil de hacer objetos 'anónimos' en tiempo de ejecución.

+0

Creo que quiere decir: cuando el tipo no se declara – Sklivvz

+0

Gracias, esto suena factible ... Sin embargo, la voluntad de que el trabajo de una aplicación de Silverlight? No estoy seguro de si las cosas de CodeDOM están disponibles allí. –

1

Es posible que desee examinar el DLR. Todavía no lo he hecho (todavía) pero el caso de uso para el DLR (lenguajes dinámicos) se parece mucho a lo que estás tratando de hacer.

Dependiendo de lo que quiere hacer objeto proxy dinámico del Castillo-marco que podría ser una buena opción también.

+0

Gracias, suena interesante. Sin embargo, probablemente sea un "no-go" ya que planeo usarlo en una aplicación de Silverlight. –

3

Sí, la hay. De memoria:

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

object anon = create(existingAnonymousType); 
+0

Gracias, esta parece la única manera simple. No es una cosa muy simple de hacer. –

+0

Mirando hacia atrás en esto, esto simplemente se unirá a tipo de tiempo de compilación de existingAnonymousType, no su tipo en tiempo de ejecución, como el azúcar sintáctico de omitir el parámetro genérico es un artefacto de tiempo de compilación.Dicho de otra manera, si se define como objeto, se creará una instancia de objeto. – Guvante

1

Puede utilizar Reflection.Emit para generar las clases necesarias de forma dinámica, aunque es bastante desagradable para codificar para arriba.

Si elige esta ruta, le sugiero que descargue Reflection Emit Language Addin para .NET Reflector, ya que esto le permite ver cómo se construirían las clases existentes utilizando Reflection.Emit, de ahí un buen método para aprender este rincón del marco.

+0

Gracias, eso es factible, pero probablemente no funcionará junto con las clases anónimas existentes, creo. –

1

También puede ser que desee echar un vistazo a la clase FormatterServices: MSDN entry on FormatterServices

Contiene GetSafeUninitializedObject que va a crear una instancia de la clase vacía, y varios otros métodos prácticos cuando se hace la serialización.

Respondiendo al comentario de Michael: Si no tiene la instancia de tipo para el tipo T, siempre puede obtenerla de typeof (T). Si tiene un objeto de un tipo desconocido, puede invocar GetType() para obtener la instancia de Tipo.

+0

El problema es que no tengo una instancia de tipo. Pero gracias por la propina, vale la pena mirar de todos modos. –

+0

Sí, lo de GetType tiene sentido. Así que parece que solo necesito crear un ejemplo de cada objeto y copiarlos más tarde. –

Cuestiones relacionadas