类
/// <summary>
/// 支持通过属性名称索引的泛型包装类
/// </summary>
public class PropertyIndexer<T> : IEnumerable<T>
{private T[] _items;private T _instance;private PropertyInfo[] _properties;private bool _caseSensitive;public PropertyIndexer(T item, bool caseSensitive = true){_instance = item;_caseSensitive = caseSensitive;_properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);}// 通过属性名称获取值public object this[string propertyName]{get{PropertyInfo property = FindProperty(propertyName);if (property == null)throw new ArgumentException($"找不到属性: {propertyName}");return property.GetValue(_instance);}set{PropertyInfo property = FindProperty(propertyName);if (property == null)throw new ArgumentException($"找不到属性: {propertyName}");// 类型转换object convertedValue = Convert.ChangeType(value, property.PropertyType);property.SetValue(_instance, convertedValue);}}// 查找属性(支持大小写敏感/不敏感)private PropertyInfo FindProperty(string propertyName){if (_caseSensitive){return Array.Find(_properties, p => p.Name == propertyName);}else{return Array.Find(_properties, p => p.Name.Equals(propertyName, StringComparison.OrdinalIgnoreCase));}}// 获取底层实例public T Instance => _instance;// 实现IEnumerable<T>接口public IEnumerator<T> GetEnumerator(){foreach (T item in _items){yield return item;}}// 显式实现非泛型接口IEnumerator IEnumerable.GetEnumerator(){return GetEnumerator();}
}
实体类转换方法
//将实体类集合转换为支持属性名称索引的类
public static List<PropertyIndexer<T>> ConvertToPropertyIndexer<T>(List<T> dataList) {List<PropertyIndexer<T>> result = new List<PropertyIndexer<T>>();foreach (T item in dataList) {result.Add(new PropertyIndexer<T>(item));}return result;
}
//索引类转换为实体类
public static List<T> ConvertToPropertyIndexer<T>(List<PropertyIndexer<T>> dataList)
{List<T> result = new List<T>();foreach (PropertyIndexer<T> item in dataList){result.Add(item.Instance);}return result;
}
调用
public ClassA{public string name {get;set;}public string value {get;set;}
}List<ClassA> list = new List<ClassA>(){new ClassA(){name = "a",value="1" },new ClassA(){name = "b",value="2" },
}List<PropertyIndexer<ClassA>> values =DataCountCenterService.ConvertToPropertyIndexer<ClassA>(list);Console.WriteLine(values[0]["name"].ToString());//索引取字段值的返回结果是object,需要进行转换,此处输出结果为a