/// <summary> /// Gets the display name for the specified property. /// </summary> /// <param name="pd">The property descriptor.</param> /// <param name="declaringType">The declaring type.</param> /// <returns> /// A display name string. /// </returns> protected virtual string GetDisplayName(PropertyDescriptor pd, Type declaringType) { var displayName = pd.GetDisplayName(); if (this.ModifyCamelCaseDisplayNames && displayName == pd.Name) { displayName = StringUtilities.FromCamelCase(displayName); } return(displayName); }
private void DiscoverRecordFields(Type recordType, ref int position, string declaringMember = null, bool optIn = false, PropertyDescriptor propDesc = null) { if (!recordType.IsDynamicType()) { Type pt = null; if (optIn) //ChoTypeDescriptor.GetProperties(recordType).Where(pd => pd.Attributes.OfType<ChoCSVRecordFieldAttribute>().Any()).Any()) { foreach (PropertyDescriptor pd in ChoTypeDescriptor.GetProperties(recordType)) { pt = pd.PropertyType.GetUnderlyingType(); if (!pt.IsSimple() && !typeof(IEnumerable).IsAssignableFrom(pt)) { DiscoverRecordFields(pt, ref position, declaringMember == null ? pd.Name : "{0}.{1}".FormatString(declaringMember, pd.Name), optIn); } else if (pd.Attributes.OfType <ChoCSVRecordFieldAttribute>().Any()) { var obj = new ChoCSVRecordFieldConfiguration(pd.Name, pd.Attributes.OfType <ChoCSVRecordFieldAttribute>().First(), pd.Attributes.OfType <Attribute>().ToArray()); obj.FieldType = pt; obj.PropertyDescriptor = pd; obj.DeclaringMember = declaringMember == null ? null : "{0}.{1}".FormatString(declaringMember, pd.Name); if (!CSVRecordFieldConfigurations.Any(c => c.Name == pd.Name)) { CSVRecordFieldConfigurations.Add(obj); } } } } else { if (typeof(IList).IsAssignableFrom(recordType) && !typeof(ArrayList).IsAssignableFrom(recordType) && !recordType.IsInterface) { if (propDesc != null) { RangeAttribute dnAttr = propDesc.Attributes.OfType <RangeAttribute>().FirstOrDefault(); if (dnAttr == null) { ChoCSVRecordFieldConfiguration obj = NewFieldConfiguration(ref position, null, propDesc, null, declaringMember == null ? propDesc.GetDisplayName() : propDesc.GetDisplayName(String.Empty)); CSVRecordFieldConfigurations.Add(obj); } else if (dnAttr != null && dnAttr.Minimum.CastTo <int>() >= 0 && dnAttr.Maximum.CastTo <int>() > 0 && dnAttr.Minimum.CastTo <int>() <= dnAttr.Maximum.CastTo <int>()) { recordType = recordType.GetItemType().GetUnderlyingType(); if (recordType.IsSimple()) { for (int range = dnAttr.Minimum.CastTo <int>(); range <= dnAttr.Maximum.CastTo <int>(); range++) { ChoCSVRecordFieldConfiguration obj = NewFieldConfiguration(ref position, null, propDesc, range); //if (!CSVRecordFieldConfigurations.Any(c => c.Name == (declaringMember == null ? pd.Name : "{0}.{1}".FormatString(declaringMember, pd.Name)))) CSVRecordFieldConfigurations.Add(obj); } } else { for (int range = dnAttr.Minimum.CastTo <int>(); range <= dnAttr.Maximum.CastTo <int>(); range++) { foreach (PropertyDescriptor pd in ChoTypeDescriptor.GetProperties(recordType)) { pt = pd.PropertyType.GetUnderlyingType(); if (pt != typeof(object) && !pt.IsSimple() /*&& !typeof(IEnumerable).IsAssignableFrom(pt)*/) { //DiscoverRecordFields(pt, ref position, declaringMember == null ? pd.Name : "{0}.{1}".FormatString(declaringMember, pd.Name), optIn, pd); } else { ChoCSVRecordFieldConfiguration obj = NewFieldConfiguration(ref position, declaringMember, pd, range, propDesc.GetDisplayName()); //if (!CSVRecordFieldConfigurations.Any(c => c.Name == (declaringMember == null ? pd.Name : "{0}.{1}".FormatString(declaringMember, pd.Name)))) CSVRecordFieldConfigurations.Add(obj); } } } } } } } else if (recordType.IsGenericType && recordType.GetGenericTypeDefinition() == typeof(Dictionary <,>) /*&& typeof(string) == recordType.GetGenericArguments()[0]*/) { if (propDesc != null) { ChoDictionaryKeyAttribute[] dnAttrs = propDesc.Attributes.OfType <ChoDictionaryKeyAttribute>().ToArray(); if (dnAttrs.IsNullOrEmpty()) { ChoCSVRecordFieldConfiguration obj = NewFieldConfiguration(ref position, null, propDesc, null, declaringMember == null ? propDesc.GetDisplayName() : propDesc.GetDisplayName(String.Empty)); CSVRecordFieldConfigurations.Add(obj); } else { var keys = (from a in dnAttrs where a != null && !a.Keys.IsNullOrWhiteSpace() select a.Keys.SplitNTrim()).SelectMany(a => a).ToArray(); foreach (var key in keys) { if (!key.IsNullOrWhiteSpace()) { ChoCSVRecordFieldConfiguration obj = NewFieldConfiguration(ref position, null, propDesc, dictKey: key); //if (!CSVRecordFieldConfigurations.Any(c => c.Name == (declaringMember == null ? pd.Name : "{0}.{1}".FormatString(declaringMember, pd.Name)))) CSVRecordFieldConfigurations.Add(obj); } } } } } else { if (recordType == typeof(object) //|| typeof(IEnumerable).IsAssignableFrom(recordType) //|| typeof(ICollection).IsAssignableFrom(recordType) ) { } else if (recordType.IsSimple()) { ChoCSVRecordFieldConfiguration obj = NewFieldConfiguration(ref position, declaringMember, propDesc); if (!CSVRecordFieldConfigurations.Any(c => c.Name == propDesc.Name)) { CSVRecordFieldConfigurations.Add(obj); } } else { foreach (PropertyDescriptor pd in ChoTypeDescriptor.GetProperties(recordType)) { pt = pd.PropertyType.GetUnderlyingType(); if (pt == typeof(object) || typeof(ArrayList).IsAssignableFrom(pt) || typeof(Hashtable).IsAssignableFrom(pt) ) { continue; } if (pt != typeof(object) && !pt.IsSimple() /*&& !typeof(IEnumerable).IsAssignableFrom(pt)*/) { if (propDesc == null) { DiscoverRecordFields(pt, ref position, declaringMember == null ? pd.Name : "{0}.{1}".FormatString(declaringMember, pd.Name), optIn, pd); } else { DiscoverRecordFields(pt, ref position, declaringMember == null ? pd.Name : "{0}.{1}".FormatString(declaringMember, pd.Name), optIn, pd); } } else { ChoCSVRecordFieldConfiguration obj = NewFieldConfiguration(ref position, declaringMember, pd, null, declaringMember == null ? propDesc.GetDisplayName() : propDesc.GetDisplayName(String.Empty)); if (!CSVRecordFieldConfigurations.Any(c => c.Name == (declaringMember == null ? pd.Name : "{0}.{1}".FormatString(declaringMember, pd.Name)))) { CSVRecordFieldConfigurations.Add(obj); } } } } } } } }
public PropertyDescriptorDataModelField(PropertyDescriptor pd) { #region 基础属性 p_InnerExtend.SetExtendPropertyValue("Name", pd.GetNameForDatabase()); p_InnerExtend.SetExtendPropertyValue("Title", pd.GetDisplayName()); p_InnerExtend.SetExtendPropertyValue("Description", pd.GetDescription()); Type clrType = pd.PropertyType.GetTypeIfIsNullable(); p_InnerExtend.SetExtendPropertyValue("FieldDbType", clrType.GetDbType()); #endregion #region 扩展属性 DataModelHelper.SetExtendProerty_IsSoftDeleteField(p_InnerExtend, pd); DataModelHelper.SetExtendProerty_RowVersion(p_InnerExtend, pd); DataModelHelper.SetExtendProerty_PropertyDescription(p_InnerExtend, pd); DataModelHelper.SetExtendProerty_ClrType(p_InnerExtend, clrType); DataModelHelper.SetExtendProperty_CanbeNull(p_InnerExtend, pd); DataModelHelper.SetExtendProperty_PrimaryKey(p_InnerExtend, pd); DataModelHelper.SetExtendProperty_IndexKey(p_InnerExtend, pd); DataModelHelper.SetExtendProerty_DbFieldValueConvertType(p_InnerExtend, pd); DataModelHelper.SetExtendProperty_DefaultValue(p_InnerExtend, pd); switch (clrType.GetDbType()) { case DbType.String: { DataModelHelper.SetExtendProperty_MaxLength(p_InnerExtend, pd, 50); break; } case DbType.Decimal: { DataModelHelper.SetExtendProperty_DecimalDefine(p_InnerExtend, pd, new DecimalDefine() { DecimalLength = 18, DotLength = 2 }); break; } case DbType.Int16: case DbType.Int32: case DbType.Int64: case DbType.UInt16: case DbType.UInt32: case DbType.UInt64: { DataModelHelper.SetExtendProperty_DbGeneratedDefine(p_InnerExtend, pd); break; } } //数字是否超出范围 NumberType nt = DataValueParase.IsNumberType(clrType); if ((nt != NumberType.Unkown) || (clrType == typeof(DateTime) || clrType == typeof(TimeSpan))) { DataModelHelper.SetExtendProperty_MinMaxExpress(p_InnerExtend, pd); } #endregion }