Как создать и установить элементы/свойства класса динамически во время выполнения.Динамически создавать и устанавливать элементы/свойства класса во время выполнения
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"
}
}
И еще одна проблема в том, что я хочу, чтобы все свойства, которые должны быть установлены после указанной выше инициализации, чтобы я мог обращаться к ним как к объекту класса, жестко закодированному. Текущий код продает только последнее свойство, т. Е. Значение последней строки набора данных.
Почему вы не используете ExpandoObject? – MikeSW
Если вы сделаете это так, как позже вы сможете получить доступ к этим свойствам? Затем вам нужно знать * KeyName *, но если вы уже знаете это, почему бы вам просто не использовать словарь? –
Все ваши значения будут строками? – Ben