2013-12-16 5 views
5

Wie kann ich Member/Eigenschaften einer Klasse dynamisch zur Laufzeit erstellen und setzen?Dynamische Erstellung und Einstellung von Membern/Eigenschaften der Klasse zur Laufzeit

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

Ich habe versucht, die Idee zu ändern meine Anforderungen zu entsprechen, aber nicht in der Lage, es zu tun.

Ich bin verpflichtet, die Klassenmitglieder zur Laufzeit zu setzen, bedeutet, würde ich die Key und Value aus der Datenbank und meine Klasse wird ohne Mitglieder vor der Laufzeit definiert vollständig dynamisch sein holen, aber alle von ihnen abgerufen aus der Datenbank während der Laufzeit .

geht also hier mein Code (Entnommen aus 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; 
    } 
} 
} 

Der Code, der die Mitglieder/Eigenschaften der Klasse

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" 
      } 
     } 

Und ein weiteres Problem initialisiert und definiert ist, dass ich alle wollen die Eigenschaften, die nach der obigen Initialisierung festgelegt werden, damit ich auf sie wie ein Klassenobjekt zugreifen kann, das fest codiert ist. Derzeitiger Code verkauft nur die letzte Eigenschaft, d. H. Den Wert der letzten Reihe des Datensatzes.

+0

Warum Sie keine ExpandoObject verwenden? – MikeSW

+0

Wenn Sie es so machen, wie erhalten Sie später Zugriff auf diese Eigenschaften? Sie müssten dann den * KeyName * kennen, aber wenn Sie es bereits wissen, warum benutzen Sie nicht einfach ein Wörterbuch? –

+0

Alle Ihre Werte werden Zeichenfolgen sein? – Ben

Antwort

7

Fügen Sie entweder eine wörterbuchbasierte API hinzu oder verwenden Sie eine Implementierung, die bereits vorhanden ist. Ehrlich gesagt ExpandoObject gut funktionieren würde, und hat eine IDictionary<string,object> API eingebaut.

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

danke für die Antwort und den obigen Vorschlag. Ich musste eigentlich ein 'ExpandoObject()' verwenden, um dieses 'Schlüssel-Wert'-Paar zu erhalten und die Daten dann als dynamisch zurückzugeben. – Cyberpks

+0

@marc: Ich habe Ihren Code versucht, aber diese Zeile gibt Fehler obj [KeyName] = ValueName; Ich benutze VS2010. irgendeine Hilfe. – Thomas

+1

@Thomas ah, es ist durchaus möglich, schrieb ich das auf ein Telefon! Sie müssen möglicherweise "obj" in "IDictionary " umwandeln, um auf den Indexer –

Verwandte Themen