public PropertyInfoSource(PropertyInfo property, Row basedOnRow)
        {
            if (property == null)
            {
                throw new ArgumentNullException("property");
            }

            Property   = property;
            BasedOnRow = basedOnRow;

            if (basedOnRow != null)
            {
                BasedOnField = basedOnRow.FindField(property.Name) ??
                               basedOnRow.FindFieldByPropertyName(property.Name);
            }

            var nullableType = Nullable.GetUnderlyingType(property.PropertyType);

            ValueType = nullableType ?? property.PropertyType;

            if (ValueType.GetIsEnum())
            {
                EnumType = ValueType;
            }
            else if (
                !ReferenceEquals(null, BasedOnField) &&
                BasedOnField is IEnumTypeField)
            {
                EnumType = (BasedOnField as IEnumTypeField).EnumType;
                if (EnumType != null && !EnumType.GetIsEnum())
                {
                    EnumType = null;
                }
            }
        }