1: [ExpressionPrefix("SPField")]
2: public class SPFieldExpressionBuilder : ExpressionBuilder
3: {
4: #region Public static methods
5: public static Object GetFieldValue(String fieldName, PropertyInfo propertyInfo)
6: {
7: Object fieldValue = SPContext.Current.ListItem[fieldName];
8:
9: if (fieldValue != null)
10: {
11: if ((fieldValue is IConvertible) && (typeof(IConvertible).IsAssignableFrom(propertyInfo.PropertyType) == true))
12: {
13: if (propertyInfo.PropertyType.IsAssignableFrom(fieldValue.GetType()) != true)
14: {
15: fieldValue = Convert.ChangeType(fieldValue, propertyInfo.PropertyType);
16: }
17: }
18: }
19:
20: return (fieldValue);
21: }
22:
23: #endregion
24:
25: #region Public override methods
26: public override Object EvaluateExpression(Object target, BoundPropertyEntry entry, Object parsedData, ExpressionBuilderContext context)
27: {
28: return (GetFieldValue(entry.Expression, entry.PropertyInfo));
29: }
30:
31: public override CodeExpression GetCodeExpression(BoundPropertyEntry entry, Object parsedData, ExpressionBuilderContext context)
32: {
33: if (String.IsNullOrEmpty(entry.Expression) == true)
34: {
35: return (new CodePrimitiveExpression(String.Empty));
36: }
37: else
38: {
39: return (new CodeMethodInvokeExpression(new CodeMethodReferenceExpression(new CodeTypeReferenceExpression(this.GetType()), "GetFieldValue"), new CodePrimitiveExpression(entry.Expression), new CodePropertyReferenceExpression(new CodeArgumentReferenceExpression("entry"), "PropertyInfo")));
40: }
41: }
42:
43: #endregion
44:
45: #region Public override properties
46: public override Boolean SupportsEvaluate
47: {
48: get
49: {
50: return (true);
51: }
52: }
53: #endregion
54: }