2010-10-24 16 views
6

Quiero crear un tipo anónimo dentro de una función, cuando las propiedades de tipo anónimo son los parámetros de la función.Crear un tipo anónimo a partir de la reflexión ParamInfo []

por ejemplo, para la función: private bool CreatePerson (string FirstName, string LasName, int Age, int height);

tendré un tipo anónimo con las propiedades: Nombre, Nombre, Edad y altura. y los valores de los parámetros de función serán los valores de las propiedades de tipo anónimo.

private bool CreatePerson(string FirstName, string LasName, int Age, int height) 
    { 
     // Get this method parameters 
     MethodBase currentMethod = MethodBase.GetCurrentMethod(); 
     ParameterInfo[] parametersInfo = currentMethod.GetParameters(); 

     // create an object of the parameters from the function. 
     foreach (ParameterInfo paramInfo in parametersInfo) 
     { 
      // add a property with the name of the parameter to an anonymous object and insert its value to the property. 
      // WHAT DO I DO HERE? 
      .... 
     } 

     return true; 
    } 
+0

Si desea crear un tipo anónimo con nombres y tipos de campos conocidos, ¿por qué necesita reflexión? nuevo {FirstName = FirstName, ...} haría bien? – SoftMemes

+0

Él quiere que eso se defina en tiempo de ejecución, creo. – Aliostad

+0

@Aliostad - pero la descripción solo indica que los _values_ deben provenir de los parámetros, los nombres de los parámetros/propiedades ya están allí ... – SoftMemes

Respuesta

2

Si entendí correctamente y quiere definir las propiedades en tiempo de ejecución, esto no es posible. Aunque en tipos anónimos es posible que pueda crear tipos que defina en ese momento asignando valores, el nombre de las propiedades se debe conocer al tiempo de compilación.

De hecho, el tipo es anónimo para usted pero no para el CLR. Si observa el ensamblado en ildasm.exe o reflector, verá estos tipos anónimos con nombres extraños que siempre tienen <> en sus nombres.

C dinámico # 's podría ser capaz de ayudar aquí, pero por lo que yo sé, que ayuda con comunicando con objetos que son que no tenemos información de tipo para, no creando - pero podría ser una manera que lo hago no saber.

+0

Sería bastante posible usar Reflection.Emit para generar un nuevo tipo en tiempo de ejecución, pero no puedo ver por qué querría algo como esto. – SoftMemes

+0

Es cierto que escribir código y compilar es siempre una posibilidad, pero eso no es lo que él quiere hacer. – Aliostad

+0

Reflection.Emit no está realmente "escribiendo código y compilando" ya que no hay código fuente, pero estoy de acuerdo en que es muy probable que no sea lo que necesita. – SoftMemes

0

¿No podría utilizar el patrón de diseño "Linq to DataSet" Field<T>(String Name)? De hecho, ¿por qué no solo usar una DataTable? El compilador no necesita saber que el campo existe, solo qué tipo es seguro. Una razón para hacer esto sería implementar algún tipo de analizador para generar filtros, o para configurar nombres de campo dinámicamente.

Cuestiones relacionadas