2010-10-24 14 views
6

Voglio creare un tipo anonimo all'interno di una funzione, quando le proprietà di tipo anonimo sono i parametri di funzione.Creare un tipo anonimo da reflection ParamInfo []

ad esempio, per la funzione: bool privato CreatePerson (stringa FirstName, stringa LasName, int Age, int height);

avrò un tipo anonimo con le proprietà: FirstName, LasName, Age e height. e i valori dei parametri di funzione saranno i valori delle proprietà di tipo anonimo.

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 desidera creare un tipo anonimo con nomi e tipi di campi noti, perché è necessaria la riflessione? new {FirstName = FirstName, ...} andrebbe benissimo? – SoftMemes

+0

Vuole che sia definito in runtime - Credo. – Aliostad

+0

@Aliostad - ma la descrizione dice solo che _values_ dovrebbe provenire dai parametri, i nomi dei parametri/proprietà sono già lì ... – SoftMemes

risposta

2

Se ho capito correttamente e si desidera definire le proprietà in fase di esecuzione, questo non è possibile. Sebbene nei tipi anonimi potresti essere in grado di creare tipi che definisci lì e quindi assegnando valori, il nome delle proprietà deve essere noto al tempo di compilazione.

Infatti, il tipo è anonimo ma non al CLR. Se si guarda l'assembly in ildasm.exe o reflector, vedrete questi tipi anonimi con nomi strani che hanno sempre <> nei loro nomi.

C dinamica s '# potrebbe essere in grado di aiutare qui, ma per quanto ne so, aiutano con comunicando con oggetti che sono che non abbiamo informazioni di tipo per non creare - ma ci potrebbe essere un modo che faccio non sapere.

+0

Sarebbe abbastanza possibile usare Reflection.Emit per generare un nuovo tipo in fase di esecuzione, ma non riesco a capire perché vorresti per qualcosa di simile. – SoftMemes

+0

È vero, scrivere codice e compilare è sempre una possibilità, ma non è quello che vuole fare. – Aliostad

+0

Reflection.Emit non è realmente "scrittura di codice e compilazione" in quanto non esiste un codice sorgente, ma sono d'accordo che molto probabilmente non è ciò di cui ha bisogno. – SoftMemes

0

Non è possibile utilizzare il modello di progettazione "Linq to DataSet" Field<T>(String Name)? In effetti, perché non usare solo un DataTable. Il compilatore non ha bisogno di sapere che il campo esiste, solo che tipo deve essere sicuro. Una ragione per farlo sarebbe quella di implementare qualche tipo di parser per generare filtri, o per configurare dinamicamente i nomi dei campi.

Problemi correlati