1: [AspNetHostingPermission(SecurityAction.LinkDemand, Level=200)]
2: public sealed class DataBinder
3: { 4: // Fields
5: private static readonly char[] expressionPartSeparator = new char[] { '.' }; 6: private static readonly char[] indexExprEndChars = new char[] { ']', ')' }; 7: private static readonly char[] indexExprStartChars = new char[] { '[', '(' }; 8:
9: // Methods
10: public static object Eval(object container, string expression)
11: { 12: if (expression == null)
13: { 14: throw new ArgumentNullException("expression"); 15: }
16: expression = expression.Trim();
17: if (expression.Length == 0)
18: { 19: throw new ArgumentNullException("expression"); 20: }
21: if (container == null)
22: { 23: return null;
24: }
25: string[] expressionParts = expression.Split(expressionPartSeparator);
26: return Eval(container, expressionParts);
27: }
28:
29: private static object Eval(object container, string[] expressionParts)
30: { 31: object propertyValue = container;
32: for (int i = 0; (i < expressionParts.Length) && (propertyValue != null); i++)
33: { 34: string propName = expressionParts[i];
35: if (propName.IndexOfAny(indexExprStartChars) < 0)
36: { 37: propertyValue = GetPropertyValue(propertyValue, propName);
38: }
39: else
40: { 41: propertyValue = GetIndexedPropertyValue(propertyValue, propName);
42: }
43: }
44: return propertyValue;
45: }
46:
47: public static string Eval(object container, string expression, string format)
48: { 49: object obj2 = Eval(container, expression);
50: if ((obj2 == null) || (obj2 == DBNull.Value))
51: { 52: return string.Empty;
53: }
54: if (string.IsNullOrEmpty(format))
55: { 56: return obj2.ToString();
57: }
58: return string.Format(format, obj2);
59: }
60:
61: public static object GetDataItem(object container)
62: { 63: bool flag;
64: return GetDataItem(container, out flag);
65: }
66:
67: public static object GetDataItem(object container, out bool foundDataItem)
68: { 69: if (container == null)
70: { 71: foundDataItem = false;
72: return null;
73: }
74: IDataItemContainer container2 = container as IDataItemContainer;
75: if (container2 != null)
76: { 77: foundDataItem = true;
78: return container2.DataItem;
79: }
80: string name = "DataItem";
81: PropertyInfo property = container.GetType().GetProperty(name, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
82: if (property == null)
83: { 84: foundDataItem = false;
85: return null;
86: }
87: foundDataItem = true;
88: return property.GetValue(container, null);
89: }
90:
91: public static object GetIndexedPropertyValue(object container, string expr)
92: { 93: if (container == null)
94: { 95: throw new ArgumentNullException("container"); 96: }
97: if (string.IsNullOrEmpty(expr))
98: { 99: throw new ArgumentNullException("expr"); 100: }
101: object obj2 = null;
102: bool flag = false;
103: int length = expr.IndexOfAny(indexExprStartChars);
104: int num2 = expr.IndexOfAny(indexExprEndChars, length + 1);
105: if (((length < 0) || (num2 < 0)) || (num2 == (length + 1)))
106: { 107: throw new ArgumentException(SR.GetString("DataBinder_Invalid_Indexed_Expr", new object[] { expr })); 108: }
109: string propName = null;
110: object obj3 = null;
111: string s = expr.Substring(length + 1, (num2 - length) - 1).Trim();
112: if (length != 0)
113: { 114: propName = expr.Substring(0, length);
115: }
116: if (s.Length != 0)
117: { 118: if (((s[0] == '"') && (s[s.Length - 1] == '"')) || ((s[0] == '\'') && (s[s.Length - 1] == '\'')))
119: { 120: obj3 = s.Substring(1, s.Length - 2);
121: }
122: else if (char.IsDigit(s[0]))
123: { 124: int num3;
125: flag = int.TryParse(s, NumberStyles.Integer, CultureInfo.InvariantCulture, out num3);
126: if (flag)
127: { 128: obj3 = num3;
129: }
130: else
131: { 132: obj3 = s;
133: }
134: }
135: else
136: { 137: obj3 = s;
138: }
139: }
140: if (obj3 == null)
141: { 142: throw new ArgumentException(SR.GetString("DataBinder_Invalid_Indexed_Expr", new object[] { expr })); 143: }
144: object propertyValue = null;
145: if ((propName != null) && (propName.Length != 0))
146: { 147: propertyValue = GetPropertyValue(container, propName);
148: }
149: else
150: { 151: propertyValue = container;
152: }
153: if (propertyValue == null)
154: { 155: return obj2;
156: }
157: Array array = propertyValue as Array;
158: if ((array != null) && flag)
159: { 160: return array.GetValue((int) obj3);
161: }
162: if ((propertyValue is IList) && flag)
163: { 164: return ((IList) propertyValue)[(int) obj3];
165: }
166: PropertyInfo info = propertyValue.GetType().GetProperty("Item", BindingFlags.Public | BindingFlags.Instance, null, null, new Type[] { obj3.GetType() }, null); 167: if (info == null)
168: { 169: throw new ArgumentException(SR.GetString("DataBinder_No_Indexed_Accessor", new object[] { propertyValue.GetType().FullName })); 170: }
171: return info.GetValue(propertyValue, new object[] { obj3 }); 172: }
173:
174: public static string GetIndexedPropertyValue(object container, string propName, string format)
175: { 176: object indexedPropertyValue = GetIndexedPropertyValue(container, propName);
177: if ((indexedPropertyValue == null) || (indexedPropertyValue == DBNull.Value))
178: { 179: return string.Empty;
180: }
181: if (string.IsNullOrEmpty(format))
182: { 183: return indexedPropertyValue.ToString();
184: }
185: return string.Format(format, indexedPropertyValue);
186: }
187:
188: public static object GetPropertyValue(object container, string propName)
189: { 190: if (container == null)
191: { 192: throw new ArgumentNullException("container"); 193: }
194: if (string.IsNullOrEmpty(propName))
195: { 196: throw new ArgumentNullException("propName"); 197: }
198: PropertyDescriptor descriptor = TypeDescriptor.GetProperties(container).Find(propName, true);
199: if (descriptor == null)
200: { 201: throw new HttpException(SR.GetString("DataBinder_Prop_Not_Found", new object[] { container.GetType().FullName, propName })); 202: }
203: return descriptor.GetValue(container);
204: }
205:
206: public static string GetPropertyValue(object container, string propName, string format)
207: { 208: object propertyValue = GetPropertyValue(container, propName);
209: if ((propertyValue == null) || (propertyValue == DBNull.Value))
210: { 211: return string.Empty;
212: }
213: if (string.IsNullOrEmpty(format))
214: { 215: return propertyValue.ToString();
216: }
217: return string.Format(format, propertyValue);
218: }
219:
220: internal static bool IsNull(object value)
221: { 222: if ((value != null) && !Convert.IsDBNull(value))
223: { 224: return false;
225: }
226: return true;
227: }
228: }