private static bool ValuesAreEqual(Value value1, Value value2) {
       Dictionary<Type, ValueEqualityDelegate> switcher = 
         new Dictionary<Type, ValueEqualityDelegate>();
      switcher.Add(typeof(TextValue), new ValueEqualityDelegate(TextValuesAreEqual));
      switcher.Add(typeof(NumberValue), new ValueEqualityDelegate(NumberValuesAreEqual));
      switcher.Add(typeof(BooleanValue), new ValueEqualityDelegate(BooleanValuesAreEqual));
      switcher.Add(typeof(SetValue), new ValueEqualityDelegate(SetValuesAreEqual));
      switcher.Add(typeof(DateValue), new ValueEqualityDelegate(DateValuesAreEqual));
      switcher.Add(typeof(DateTimeValue), new ValueEqualityDelegate(DateTimeValuesAreEqual));

      if (switcher.ContainsKey(value1.GetType())) {
        return switcher[value1.GetType()](value1, value2);
      }
      throw new NotImplementedException(String.Format("Unknown Value type {0}", value1.GetType()));
    }
 /// <summary>
 /// Gets the underlying value of the Value object. For SetValues, returns
 /// a List of underlying values.
 /// </summary>
 /// <value>The Value object to get the value from.</value>
 /// <returns>The underlying value, or List of underlying values from a SetValue.</returns>
 public static object GetValue(Value value) {
   if (value is SetValue) {
     PropertyInfo propInfo = value.GetType().GetProperty("values");
     if(propInfo != null) {
       Value[] setValues = propInfo.GetValue(value, null) as Value[];
       List<object> extractedValues = new List<object>();
       foreach (Value setValue in setValues) {
         validateSetValueForSet(GetValue(setValue), extractedValues);
         extractedValues.Add(GetValue(setValue));
       }
       return extractedValues;
     }
   } else {
     PropertyInfo propInfo = value.GetType().GetProperty("value");
     if (propInfo != null) {
       return propInfo.GetValue(value, null);
     }
   }
   return null;
 }
 /// <summary>
 /// Adds a new value to the list of query parameters.
 /// </summary>
 /// <param name="key">The parameter name.</param>
 /// <param name="value">The parameter value.</param>
 /// <returns>The statement builder, for chaining method calls.</returns>
 private StatementBuilder AddValue(string key, Value value) {
   String_ValueMapEntry queryValue = new String_ValueMapEntry();
   queryValue.key = key;
   queryValue.value = value;
   valueEntries.Add(queryValue);
   return this;
 }
    private static bool SetValuesAreEqual(Value value1, Value value2) {
      Value[] set1 = (value1 as SetValue).values;
      Value[] set2 = (value2 as SetValue).values;

      if (set1.Length != set2.Length) {
        return false;
      }

      for (int i = 0; i < set1.Length; i++) {
        if (!ValuesAreEqual(set1[i], set2[i])) {
          return false;
        }
      }
      return true;
    }
 private static bool BooleanValuesAreEqual(Value value1, Value value2) {
   return (value1 as BooleanValue).value == (value2 as BooleanValue).value;
 }
 private static bool NumberValuesAreEqual(Value value1, Value value2) {
   return String.Equals((value1 as NumberValue).value, (value2 as NumberValue).value);
 }
 private static bool DateTimeValuesAreEqual(Value value1, Value value2) {
   DateTime dateTime1 = (value1 as DateTimeValue).value;
   DateTime dateTime2 = (value2 as DateTimeValue).value;
   return DatesAreEqual(dateTime1.date, dateTime2.date)
       && dateTime1.hour == dateTime2.hour
       && dateTime1.minute == dateTime2.minute
       && dateTime1.second == dateTime2.second
       && String.Equals(dateTime1.timeZoneID, dateTime2.timeZoneID);
 }
 private static bool DateValuesAreEqual(Value value1, Value value2) {
   Date date1 = (value1 as DateValue).value;
   Date date2 = (value2 as DateValue).value;
   return DatesAreEqual(date1, date2);
 }