2013-10-02 22 views
28

Ho un ExpandoObject e voglio creare un getter per esso che restituirà una proprietà per nome in fase di esecuzione, dove il nome è specificato in una stringa anziché in codice.Come ottenere dinamicamente una proprietà per nome da un ExpandoObject C#?

Per esempio, posso fare questo:

account.features.isEmailEnabled; 

e che restituirà true. account è un ExpandoObject e features è anche un ExpandoObject. Quindi ho uno ExpandoObject che contiene altri ExpandoObjects.

Quindi quello che voglio essere in grado di fare è questo:

account.features.GetProperty("isEmailEnabled"); 

e che hanno return true.

La ragione è che ho molte funzionalità e desidero essere in grado di scrivere un metodo generico getter in cui posso passare il nome della funzionalità che desidero e il metodo restituirà il valore dell'account. features.whatever (dove "qualunque cosa" è specificato passando una stringa al metodo generico getter). Altrimenti dovrò scrivere 30-alcuni getters uno per ogni funzione.

ho fatto un sacco di ricerche e provato a fare qualcosa di simile:

var prop = account.features.GetType(); 
// this returns System.Dyanmic.ExpandoObject 

seguito da

var value = prop.GetProperty(featureNameAsString); 

ma value torna sempre come null. Non capisco perché. Nella finestra dell'orologio posso fare account.features.isEmailEnabled e si mostra vero e dice che è un booleano. Ma se provo a ottenere questo valore usando l'approccio sopra e passo in isEmailEnabled come il featureNameAsString ottengo solo null.

Qualcuno può dirmi per favore cosa posso fare male e quale è un buon approccio, senza che sia troppo complesso?

Sto lavorando con ASP.NET nell'ambito del framework 4.5.1.

risposta

51

ExpandoObject fornisce l'accesso sia tramite dynamic e via IDictionary<string,object> - così si potrebbe utilizzare l'API dizionario:

var byName = (IDictionary<string,object>)account.features; 
bool val = (bool)byName["isEmailEnabled"]; 

o se il nome è fisso, basta:

bool val = ((dynamic)account).features.isEmailEnabled; 
Problemi correlati