2013-12-16 3 views
5

Как создать и установить элементы/свойства класса динамически во время выполнения.Динамически создавать и устанавливать элементы/свойства класса во время выполнения

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

Я попытался изменить эту идею, чтобы удовлетворить мои требования, но не в состоянии сделать это.

Я обязан установить член класса во время выполнения, значу, я бы принести Key и Value из базы данных и мой класс будет полностью динамическим без каких-либо элементов, описанных перед выполнением, но все они извлекаются из базы данных во время выполнения ,

Так вот идет мой код (из 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; 
    } 
} 
} 

Код, который инициализирует и определяет элементы/свойства класса

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

И еще одна проблема в том, что я хочу, чтобы все свойства, которые должны быть установлены после указанной выше инициализации, чтобы я мог обращаться к ним как к объекту класса, жестко закодированному. Текущий код продает только последнее свойство, т. Е. Значение последней строки набора данных.

+0

Почему вы не используете ExpandoObject? – MikeSW

+0

Если вы сделаете это так, как позже вы сможете получить доступ к этим свойствам? Затем вам нужно знать * KeyName *, но если вы уже знаете это, почему бы вам просто не использовать словарь? –

+0

Все ваши значения будут строками? – Ben

ответ

7

Либо добавить словарь на основе API, либо использовать реализацию, которая уже имеет его. Откровенно ExpandoObject будет работать нормально, и имеет 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

спасибо за ответ и предложение выше. Я должен был использовать 'ExpandoObject()', чтобы поддерживать пару «Key-Value», а затем возвращать данные как динамические. – Cyberpks

+0

@marc: я пробовал ваш код, но эта строка дает ошибку obj [KeyName] = ValueName; Я использую VS2010. любая помощь. – Thomas

+1

@ Томас ах, вполне возможно, я написал это на телефоне! Вам может потребоваться бросить 'obj' в' IDictionary 'для доступа к indexer –

Смежные вопросы