public class FieldHelper
{
private static readonly Dictionary<string, esriFieldType> FieldTypes = new Dictionary<string, esriFieldType>
{
{"esriFieldTypeSmallInteger", esriFieldType.esriFieldTypeInteger},
{"esriFieldTypeInteger", esriFieldType.esriFieldTypeInteger},
{"esriFieldTypeSingle", esriFieldType.esriFieldTypeSingle},
{"esriFieldTypeDouble",esriFieldType.esriFieldTypeDouble},
{"esriFieldTypeString", esriFieldType.esriFieldTypeString},
{"esriFieldTypeDate",esriFieldType.esriFieldTypeDate},
{"esriFieldTypeOID", esriFieldType.esriFieldTypeOID},
{"esriFieldTypeGeometry", esriFieldType.esriFieldTypeGeometry},
{"esriFieldTypeBlob",esriFieldType.esriFieldTypeBlob},
{"esriFieldTypeRaster", esriFieldType.esriFieldTypeRaster},
{"esriFieldTypeGUID", esriFieldType.esriFieldTypeGUID},
{"esriFieldTypeGlobalID", esriFieldType.esriFieldTypeGlobalID},
{"esriFieldTypeXML", esriFieldType.esriFieldTypeXML}
};
public static Type GetTypeFromEsriFieldType(esriFieldType fieldType)
{
Type type = null;
switch (fieldType)
{
case esriFieldType.esriFieldTypeString:
type = Type.GetType("System.String");
break;
case esriFieldType.esriFieldTypeSingle:
type = Type.GetType("System.Single");
break;
case esriFieldType.esriFieldTypeSmallInteger:
type = Type.GetType("System.Int16");
break;
case esriFieldType.esriFieldTypeDate:
type = Type.GetType("System.DateTime");
break;
case esriFieldType.esriFieldTypeInteger:
case esriFieldType.esriFieldTypeOID:
type = Type.GetType("System.Int32");
break;
case esriFieldType.esriFieldTypeDouble:
type = Type.GetType("System.Double");
break;
default:
break;
}
return type;
}
public static bool VisibleField(IField field, ILayerFields layerFields)
{
if (layerFields == null) return true;
int index = layerFields.FindField(field.Name);
if (index < 0) return true;
IFieldInfo fieldInfo = layerFields.FieldInfo[index];
return fieldInfo.Visible;
}
public static void SetVisibleField(ILayerFields layerFields, string[] hideFields)
{
if (layerFields == null || hideFields == null) return;
foreach (string field in hideFields)
{
int index = layerFields.FindField(field);
if (index >= 0)
layerFields.FieldInfo[index].Visible = false;
}
}
public static IEnumerable<string> GetVisibleField(ILayerFields layerFields)
{
if (layerFields == null) return null;
List<string> listHideFields = new List<string>();
for (int i = 0; i < layerFields.FieldCount; i++)
{
IFieldInfo fieldInfo = layerFields.FieldInfo[i];
IField field = layerFields.Field[i];
if (!fieldInfo.Visible)
listHideFields.Add(field.Name);
}
return listHideFields.Count == 0 ? null : listHideFields;
}
public static IField GetShapeField(IFields pFields)
{
if (pFields == null) return null;
for (int i = 0; i < pFields.FieldCount; i++)
{
if (pFields.Field[i].Type == esriFieldType.esriFieldTypeGeometry)
{
return pFields.Field[i];
}
}
return null;
}
public static IFields CreatedDefaultFields(esriGeometryType type, ISpatialReference spatialReference, bool hasM = false)
{
IFeatureClassDescription pFeaClassDesc = new FeatureClassDescriptionClass();
IObjectClassDescription pObjClassDesc = (IObjectClassDescription)pFeaClassDesc;
IFields pFields = pObjClassDesc.RequiredFields;
int iShapeFieldIndex = pFields.FindField(pFeaClassDesc.ShapeFieldName);
IField pShapeField = pFields.Field[iShapeFieldIndex];
IGeometryDef pGeometryDef = pShapeField.GeometryDef;
IGeometryDefEdit pGeometryDefEdit = (IGeometryDefEdit)pGeometryDef;
pGeometryDefEdit.GeometryType_2 = type;
pGeometryDefEdit.HasM_2 = hasM;
pGeometryDefEdit.GridCount_2 = 1;
pGeometryDefEdit.set_GridSize(0, 0);
pGeometryDefEdit.SpatialReference_2 = spatialReference;
return pFields;
}
public static void AddField(IFeatureClass featureClass, IField field)
{
ISchemaLock schemaLock = (ISchemaLock)featureClass;
try
{
schemaLock.ChangeSchemaLock(esriSchemaLock.esriExclusiveSchemaLock);
if (featureClass.FindField(field.Name) == -1)
{
featureClass.AddField(field);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
schemaLock.ChangeSchemaLock(esriSchemaLock.esriSharedSchemaLock);
}
}
public static void AddImField(IFeatureClass featureClass, IField field)
{
try
{
if (featureClass.FindField(field.Name) == -1)
{
featureClass.AddField(field);
}
}
catch (Exception)
{
}
}
public static IFields ValidateFieldsForWorkspace(IWorkspace workspace, IFields fields)
{
IFieldChecker pFieldChecker = new FieldCheckerClass();
pFieldChecker.ValidateWorkspace = workspace;
IEnumFieldError enumFieldError;
IFields validatedFields;
pFieldChecker.Validate(fields, out enumFieldError, out validatedFields);
IFieldError fieldError;
enumFieldError.Reset();
while ((fieldError = enumFieldError.Next()) != null)
{
IField errorField = fields.Field[fieldError.FieldIndex];
}
return validatedFields;
}
public static void DeleteField(IFields pInFields, IField pDeleteField)
{
IFieldsEdit pFieldsEdit = pInFields as IFieldsEdit;
if (pFieldsEdit == null) return;
pFieldsEdit.DeleteAllFields();
pFieldsEdit.DeleteField(pDeleteField);
}
public static void DeleteField(IObjectClass objectClass, string fieldName)
{
int fieldIndex = objectClass.FindField(fieldName);
IField field = objectClass.Fields.Field[fieldIndex];
ISchemaLock schemaLock = (ISchemaLock)objectClass;
try
{
schemaLock.ChangeSchemaLock(esriSchemaLock.esriExclusiveSchemaLock);
objectClass.DeleteField(field);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
finally
{
schemaLock.ChangeSchemaLock(esriSchemaLock.esriSharedSchemaLock);
}
}
public static IField CopyField(IField pInField)
{
IField pOutField = (pInField as IClone).Clone() as IField;
return pOutField;
}
public string ReadStringFromBlob(object objValue)
{
string result = string.Empty;
IMemoryBlobStreamVariant pMemoryBlobStreamVariant = objValue as IMemoryBlobStreamVariant;
if (pMemoryBlobStreamVariant == null) return result;
pMemoryBlobStreamVariant.ExportToVariant(out objValue);
result = Encoding.Default.GetString(objValue as byte[]);
return result;
}
public byte[] ReadBytesFromBlob(object objValue)
{
IMemoryBlobStreamVariant pMemoryBlobStreamVariant = objValue as IMemoryBlobStreamVariant;
if (pMemoryBlobStreamVariant != null)
pMemoryBlobStreamVariant.ExportToVariant(out objValue);
byte[] bytes = objValue as byte[];
return bytes;
}
public static IMemoryBlobStream WriteStringToBlob(string sValue)
{
IMemoryBlobStream blobStream = new MemoryBlobStreamClass();
if (string.IsNullOrWhiteSpace(sValue)) return blobStream;
object objValue = Encoding.Default.GetBytes(sValue);
(blobStream as IMemoryBlobStreamVariant).ImportFromVariant(objValue);
return blobStream;
}
public static IMemoryBlobStream WriteBytesToBlob(byte[] bytes)
{
IMemoryBlobStream blobStream = new MemoryBlobStreamClass();
(blobStream as IMemoryBlobStreamVariant).ImportFromVariant(bytes);
return blobStream;
}
public static void SaveBlobValue(IRowBuffer rowBuffer, int iFieldIndex, object value)
{
if (value is IPersistStream)
{
IMemoryBlobStream pBlobStream = new MemoryBlobStreamClass();
(value as IPersistStream).Save(pBlobStream, 0);
rowBuffer.set_Value(iFieldIndex, pBlobStream);
}
else
{
IMemoryBlobStream pBlobStream = new MemoryBlobStreamClass();
rowBuffer.set_Value(iFieldIndex, pBlobStream);
}
}
public static int GetFieldsCount(IFields pFields)
{
IFieldsEdit pFieldsEdit = pFields as IFieldsEdit;
return pFieldsEdit.FieldCount;
}
public static IGeometryDef GetGeometryDef(IFeatureClass featureClass)
{
String shapeFieldName = featureClass.ShapeFieldName;
IFields fields = featureClass.Fields;
int geometryIndex = fields.FindField(shapeFieldName);
IField field = fields.Field[geometryIndex];
IGeometryDef geometryDef = field.GeometryDef;
return geometryDef;
}
public static IField CreateStringField(string name, string aliasName, string fieldType, int length)
{
return CreateField(name, aliasName, fieldType, length);
}
public static IField CreateIntegerField(string name, string aliasName, string fieldType, int precision)
{
return CreateField(name, aliasName, fieldType, -1, precision);
}
public static IField CreateFloatField(string name, string aliasName, string fieldType, int precision, int scale)
{
return CreateField(name, aliasName, fieldType, -1, precision, scale);
}
public static IField CreateField(string name, string aliasName, string fieldType, int length = -1, int precision = -1, int scale = -1, object defaultValue = null, bool isNullable = true)
{
IField pField = new FieldClass();
IFieldEdit pFieldEdit = pField as IFieldEdit;
pFieldEdit.Name_2 = name;
pFieldEdit.AliasName_2 = aliasName;
esriFieldType esriFieldType = GetGeometryType(fieldType);
switch (esriFieldType)
{
case esriFieldType.esriFieldTypeSmallInteger:
case esriFieldType.esriFieldTypeInteger:
pFieldEdit.Precision_2 = precision;
break;
case esriFieldType.esriFieldTypeSingle:
case esriFieldType.esriFieldTypeDouble:
pFieldEdit.Precision_2 = precision;
pFieldEdit.Scale_2 = scale;
break;
case esriFieldType.esriFieldTypeString:
pFieldEdit.Length_2 = length;
break;
}
pFieldEdit.Type_2 = esriFieldType;
if (defaultValue != null)
pFieldEdit.DefaultValue_2 = defaultValue;
pFieldEdit.IsNullable_2 = isNullable;
return pField;
}
public static IFields CreateFields(IEnumerable<FieldInfo> fieldInfos)
{
IFields pFields = new FieldsClass();
IFieldsEdit pFieldsEdit = pFields as IFieldsEdit;
foreach (FieldInfo fieldInfo in fieldInfos)
pFieldsEdit.AddField(CreateField(fieldInfo));
return pFields;
}
public static IField CreateField(FieldInfo fieldInfo)
{
IField pField = new FieldClass();
IFieldEdit pFieldEdit = pField as IFieldEdit;
pFieldEdit.Name_2 = fieldInfo.Name;
pFieldEdit.AliasName_2 = fieldInfo.AliasName;
esriFieldType esriFieldType = GetGeometryType(fieldInfo.Type);
pFieldEdit.Type_2 = esriFieldType;
switch (esriFieldType)
{
case esriFieldType.esriFieldTypeSmallInteger:
case esriFieldType.esriFieldTypeInteger:
pFieldEdit.Precision_2 = fieldInfo.Precision != null ? fieldInfo.Precision.Value : 9;
break;
case esriFieldType.esriFieldTypeSingle:
case esriFieldType.esriFieldTypeDouble:
pFieldEdit.Precision_2 = fieldInfo.Precision != null ? fieldInfo.Precision.Value : 2;
pFieldEdit.Scale_2 = fieldInfo.Scale != null ? fieldInfo.Scale.Value : 2;
break;
case esriFieldType.esriFieldTypeString:
pFieldEdit.Length_2 = fieldInfo.Length == 0 ? 255 : fieldInfo.Length;
break;
}
if (fieldInfo.DefaultValue != null)
pFieldEdit.DefaultValue_2 = fieldInfo.DefaultValue;
pFieldEdit.IsNullable_2 = fieldInfo.IsNullable != null ? fieldInfo.IsNullable.Value : true;
return pField;
}
public static esriFieldType GetGeometryType(string type)
{
return FieldTypes.ContainsKey(type)
? FieldTypes[type]
: esriFieldType.esriFieldTypeString;
}
}
public class FieldInfo
{
public string Name { get; set; }
public string AliasName { get; set; }
public string Type { get; set; }
public int Length { get; set; }
public int? Precision { get; set; }
public int? Scale { get; set; }
public bool? IsNullable { get; set; }
public object DefaultValue { get; set; }
}
public class FieldInfoEx : FieldInfo
{
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?