AutoGeneratedFieldProperties[] CreateAutoFieldProperties(IEnumerable source, IEnumerator en)
{
Data = null;
JsonData = "";
if (this.SerializationMode == SerializationMode.Complex)
{
Data = source;
return null;
}
if (source == null) return null;
if (source is string && source.ToString().StartsWith("http"))
{
this.JsonData = "'{0}'".FormatWith(source);
this.IsUrl = true;
return null;
}
ITypedList typed = source as ITypedList;
PropertyDescriptorCollection props = typed == null ? null : typed.GetItemProperties(new PropertyDescriptor[0]);
Type prop_type;
ArrayList retVal = new ArrayList();
if (props == null)
{
object fitem = null;
prop_type = null;
PropertyInfo prop_item = source.GetType().GetProperty("Item",
BindingFlags.Instance | BindingFlags.Static |
BindingFlags.Public, null, null,
new Type[] { typeof(int) }, null);
if (prop_item != null)
{
prop_type = prop_item.PropertyType;
if (prop_type.IsInterface)
{
prop_type = null;
}
}
if (prop_type == null || prop_type == typeof(object))
{
if (en.MoveNext())
{
fitem = en.Current;
this.firstRecord = fitem;
}
if (fitem != null)
{
prop_type = fitem.GetType();
}
}
if (fitem != null && fitem is ICustomTypeDescriptor)
{
props = TypeDescriptor.GetProperties(fitem);
}
else if (prop_type != null)
{
if (IsBindableType(prop_type))
{
AutoGeneratedFieldProperties field = new AutoGeneratedFieldProperties();
((IStateManager)field).TrackViewState();
field.Name = "Item";
field.DataField = BoundField.ThisExpression;
field.Type = prop_type;
retVal.Add(field);
}
else
{
if (prop_type.IsArray)
{
Data = source;
return null;
}
else
{
props = TypeDescriptor.GetProperties(prop_type);
}
}
}
}
if (props != null && props.Count > 0)
{
foreach (PropertyDescriptor current in props)
{
if (this.IsBindableType(current.PropertyType) || this.IsComplexField(current.Name))
{
AutoGeneratedFieldProperties field = new AutoGeneratedFieldProperties();
field.Name = current.Name;
field.DataField = current.Name;
retVal.Add(field);
}
}
}
if (retVal.Count > 0)
{
return (AutoGeneratedFieldProperties[])retVal.ToArray(typeof(AutoGeneratedFieldProperties));
}
return null;
}