0
|
1 using System;
|
|
2
|
|
3 namespace BLToolkit.Reflection.Extension
|
|
4 {
|
|
5 public class ValueCollection : System.Collections.Generic.Dictionary<string,object>
|
|
6 {
|
|
7 private object _value;
|
|
8 public object Value
|
|
9 {
|
|
10 get { return _value; }
|
|
11 }
|
|
12
|
|
13 public new object this[string name]
|
|
14 {
|
|
15 get
|
|
16 {
|
|
17 object value;
|
|
18 return TryGetValue(name, out value) ? value : null;
|
|
19 }
|
|
20 }
|
|
21
|
|
22 public void Add(string name, string value)
|
|
23 {
|
|
24 if (this != _null)
|
|
25 {
|
|
26 var isType = name.EndsWith(TypeExtension.ValueName.TypePostfix);
|
|
27
|
|
28 if (isType)
|
|
29 {
|
|
30 var type = Type.GetType(value, true);
|
|
31 var valueName = name.Substring(0, name.Length - TypeExtension.ValueName.TypePostfix.Length);
|
|
32
|
|
33 Add(name, type);
|
|
34
|
|
35 object val;
|
|
36
|
|
37 TryGetValue(valueName, out val);
|
|
38
|
|
39 if (val != null && val.GetType() != type)
|
|
40 {
|
|
41 base[valueName] = val = TypeExtension.ChangeType(val.ToString(), type);
|
|
42
|
|
43 if (valueName == TypeExtension.ValueName.Value)
|
|
44 _value = val;
|
|
45 }
|
|
46 }
|
|
47 else
|
|
48 {
|
|
49 object val;
|
|
50
|
|
51 var type = TryGetValue(name + TypeExtension.ValueName.TypePostfix, out val) ? (Type)val : null;
|
|
52
|
|
53 val = value;
|
|
54
|
|
55 if (type != null && type != _value.GetType())
|
|
56 val = TypeExtension.ChangeType(value, type);
|
|
57
|
|
58 if (ContainsKey(name))
|
|
59 base[name] = val;
|
|
60 else
|
|
61 Add(name, val);
|
|
62
|
|
63 if (name == TypeExtension.ValueName.Value)
|
|
64 _value = val;
|
|
65 }
|
|
66 }
|
|
67 }
|
|
68
|
|
69 private static readonly Extension.ValueCollection _null = new Extension.ValueCollection();
|
|
70 public static Extension.ValueCollection Null
|
|
71 {
|
|
72 get { return _null; }
|
|
73 }
|
|
74 }
|
|
75 }
|