/// <summary>
 /// Determines the Type to use as a basis for generating a PropertyEditor for the specified member
 /// by evaluating the members current value and static Type.
 /// </summary>
 /// <param name="member"></param>
 /// <param name="values"></param>
 /// <returns></returns>
 protected Type ReflectTypeForMember(MemberInfo member, IEnumerable <object> values)
 {
     if (member is FieldInfo)
     {
         FieldInfo field = member as FieldInfo;
         if (values != null)
         {
             return(PropertyEditor.ReflectDynamicType(field.FieldType, values.Where(v => v != null).Select(v => field.GetValue(v))));
         }
         else
         {
             return(field.FieldType);
         }
     }
     else if (member is PropertyInfo)
     {
         PropertyInfo property = member as PropertyInfo;
         if (values != null)
         {
             return(PropertyEditor.ReflectDynamicType(property.PropertyType, values.Where(v => v != null).Select(v => property.GetValue(v, null))));
         }
         else
         {
             return(property.PropertyType);
         }
     }
     else
     {
         throw new ArgumentException("Only PropertyInfo and FieldInfo members are supported");
     }
 }
 /// <summary>
 /// Determines the Type to use as a basis for generating a PropertyEditor for the specified member
 /// by evaluating the members current value and static Type.
 /// </summary>
 /// <param name="member"></param>
 /// <param name="values"></param>
 /// <returns></returns>
 protected Type ReflectTypeForMember(MemberInfo member, IEnumerable <object> values)
 {
     if (member is FieldInfo)
     {
         FieldInfo field = member as FieldInfo;
         if (values != null)
         {
             return(PropertyEditor.ReflectDynamicType(field.FieldType, values.Where(v => v != null).Select(v => field.GetValue(v))));
         }
         else
         {
             return(field.FieldType);
         }
     }
     else if (member is PropertyInfo)
     {
         PropertyInfo property = member as PropertyInfo;
         if (values != null)
         {
             List <object> propertyValues = new List <object>();
             foreach (object obj in values)
             {
                 if (obj == null)
                 {
                     continue;
                 }
                 try
                 {
                     object value = property.GetValue(obj, null);
                     propertyValues.Add(value);
                 }
                 catch (TargetInvocationException) { }
             }
             return(PropertyEditor.ReflectDynamicType(property.PropertyType, propertyValues));
         }
         else
         {
             return(property.PropertyType);
         }
     }
     else
     {
         throw new ArgumentException("Only PropertyInfo and FieldInfo members are supported");
     }
 }