2013-10-02 9 views
28

Bir ExpandoObject var ve bunun için bir dosya alıp, çalışma zamanında adına bir ad verilecek, burada adı kodlanmış bir dizede değil, bir dizede belirtilecektir.C# ExpandoObject öğesinden bir adı nasıl dinamik olarak alabilirim?

account.features.isEmailEnabled; 

ve bu doğru döndürür:

Örneğin, ben bunu CAN. account, bir ExpandoObject ve features da bir ExpandoObject'dur. Yani diğer ExpandoObjects içeren ExpandoObject var.

Yani ne yapmak isterler şudur:

account.features.GetProperty("isEmailEnabled"); 

ve gerçek olduğunu dönüşü var.

Bunun nedeni, birçok özelliğe sahip olduğum ve istediğim özellik adına iletebildiğim bir genel getter yöntemi yazabilmem ve yöntem bana hesap değerini geri aktaracak. features.whatever ("ne olursa olsun" bir dizede genel getter yöntemine geçirerek belirtilir). Aksi halde, her özellik için 30-biraz getiri yazmam gerekecek.

ben çok araştırma yaptım ve böyle bir şey yaptığını çalıştı: her zaman boş olarak geri geliyor

var value = prop.GetProperty(featureNameAsString); 

ama value ardından

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

. Nedenini anlamıyorum. Gözetleme penceresinde account.features.isEmailEnabled yapabilirim ve doğru gösterir ve bir boolean diyor. Ama eğer yukarıdaki yaklaşımı kullanarak bu değere ulaşmaya çalışırsam ve isEmailEnabled'u featureNameAsString olarak geçersem, sadece boş olurum.

Birisi bana ne yapmam gerektiğini ve ne karmaşık bir yaklaşım olmaksızın iyi bir yaklaşım olduğunu söyleyebilir mi?

ASP.NET ile 4.5.1 çerçevesi altında çalışıyorum.

cevap

51

ExpandoObjectdynamic yoluyla ve IDictionary<string,object> aracılığıyla hem erişim sağlar - böylece yalnızca sözlük API kullanabilirsiniz:

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

Veya adı sabittir eğer, sadece