2013-12-16 16 views
5

W jaki sposób można dynamicznie tworzyć i ustawiać elementy/właściwości klasy w środowisku wykonawczym.Dynamiczne tworzenie i ustawianie elementów/właściwości klasy w środowisku wykonawczym

Ref: http://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject.trygetmember(v=vs.110).aspx

Próbowałem zmodyfikować pomysł, aby spełnić moje wymagania, ale w stanie to zrobić.

jestem zobowiązany do ustawienia członków klasy w czasie wykonywania, oznacza chciałbym sprowadzić Key i Value z bazy danych i moja klasa będzie całkowicie dynamiczny bez członków zdefiniowanych wcześniej wykonywania, ale wszystkie z nich są pobierane z bazy danych podczas wykonywania .

Więc tu idzie mój kod (wzięte z MSDN):

public class DynamicObjDictionary : DynamicObject 
{ 
    // The inner dictionary. 
    Dictionary<string, object> dictionary = new Dictionary<string, object>(); 
    public int Count 
    { 
     get{return dictionary.Count;} 
    } 

public override bool TryGetMember(GetMemberBinder binder, out object result) 
    { 
     string name = binder.Name.ToLower(); 
     return dynDict.TryGetValue(name, out result); 
    } 

    public override bool TrySetMember(SetMemberBinder binder, object value) 
    { 
     dynDict[binder.Name.ToLower()] = value; 
     return true; 
    } 
} 
} 

Kod, który inicjuje i wyznacza członków/właściwości klasy

dynamic DynObj = new DynamicObjDictionary(); 
     DataSet ds = new DataSet(); 
     ds = GetObjectProperties() // returns dataset having the properties as key and value pair; 
     if (ds.Tables["PropTable"].Rows.Count > 0) 
     { 
      foreach (DataRow dr in ds.Tables["PropTable"].Rows) 
      { 
       string KeyName = dr["KeyName"].ToString(); 
       string ValueName= dr["ValueName"].ToString(); 
       //---I want that in place of fldName the actual value from dr is added to the class - currently it returns DynObj.KeyName only. 
       DynObj.KeyName = ValueName; 
       // Means if current dr["KeyName"].ToString() has "Property1" 
       // And dr["ValueName"].ToString() has "PropertyValue" 
       // The DynObj should be like DynObj.Property1 = "PropertyValue" 
      } 
     } 

I Innym problemem jest to, że chcę wszystko właściwości, które należy ustawić po powyższej inicjalizacji, aby uzyskać do nich dostęp, tak jak obiekt klasy, który jest zakodowany na stałe. Bieżący kod sprzedaje ostatnią właściwość, tj. Wartość ostatniego wiersza zestawu danych.

+0

Dlaczego nie używasz ExpandoObject? – MikeSW

+0

Jeśli zrobisz to w ten sposób, w jaki sposób uzyskasz dostęp do tych właściwości później? Będziesz wtedy potrzebował znać * KeyName *, ale jeśli już to wiesz, dlaczego po prostu nie użyjesz słownika? –

+0

Wszystkie twoje wartości będą ciągami? – Ben

Odpowiedz

7

Dodaj interfejs API oparty na słowniku lub użyj implementacji, która już go posiada. Szczerze ExpandoObject będzie działać dobrze i ma wbudowany IDictionary<string,object> API.

var obj = new ExpandoObject(); 
DataSet ds = GetObjectProperties() // returns dataset having the properties as key and value pair; 
if (ds.Tables["PropTable"].Rows.Count > 0) 
{ 
    foreach (DataRow dr in ds.Tables["PropTable"].Rows) 
    { 
     string KeyName = dr["KeyName"].ToString(); 
     string ValueName= dr["ValueName"].ToString(); 
     obj[KeyName] = ValueName; 
    } 
} 
dynamic DynObj = obj; 
// ... 
+0

dzięki za odpowiedź i sugestię powyżej. Musiałem w rzeczywistości użyć 'ExpandoObject()', aby zachować tę parę "Key-Value", a następnie zwrócić dane jako dynamiczne. – Cyberpks

+0

@marc: próbowałem twojego kodu, ale ta linia daje błąd obj [KeyName] = ValueName; używam VS2010. jakaś pomoc. – Thomas

+1

@Thomas ah, jest to całkowicie możliwe, że napisałem to na "telefonie! Aby uzyskać dostęp do indeksera –

Powiązane problemy