Mercurial > pub > bltoolkit
diff Source/Reflection/Extension/ValueCollection.cs @ 0:f990fcb411a9
Копия текущей версии из github
author | cin |
---|---|
date | Thu, 27 Mar 2014 21:46:09 +0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Source/Reflection/Extension/ValueCollection.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,75 @@ +using System; + +namespace BLToolkit.Reflection.Extension +{ + public class ValueCollection : System.Collections.Generic.Dictionary<string,object> + { + private object _value; + public object Value + { + get { return _value; } + } + + public new object this[string name] + { + get + { + object value; + return TryGetValue(name, out value) ? value : null; + } + } + + public void Add(string name, string value) + { + if (this != _null) + { + var isType = name.EndsWith(TypeExtension.ValueName.TypePostfix); + + if (isType) + { + var type = Type.GetType(value, true); + var valueName = name.Substring(0, name.Length - TypeExtension.ValueName.TypePostfix.Length); + + Add(name, type); + + object val; + + TryGetValue(valueName, out val); + + if (val != null && val.GetType() != type) + { + base[valueName] = val = TypeExtension.ChangeType(val.ToString(), type); + + if (valueName == TypeExtension.ValueName.Value) + _value = val; + } + } + else + { + object val; + + var type = TryGetValue(name + TypeExtension.ValueName.TypePostfix, out val) ? (Type)val : null; + + val = value; + + if (type != null && type != _value.GetType()) + val = TypeExtension.ChangeType(value, type); + + if (ContainsKey(name)) + base[name] = val; + else + Add(name, val); + + if (name == TypeExtension.ValueName.Value) + _value = val; + } + } + } + + private static readonly Extension.ValueCollection _null = new Extension.ValueCollection(); + public static Extension.ValueCollection Null + { + get { return _null; } + } + } +}