C#如何获取自定义类中已被赋值的属性名称列表?
实现方案
你可以通过反射对比默认值或者记录赋值操作两种方案实现,以下是具体代码:
方案1:反射对比默认值(无需修改原有属性定义)
这种方案不用改动你现有的自动属性,通过反射遍历所有属性,判断值是否不等于类型默认值来筛选已赋值的属性,适合你的示例场景。
第一步:引入必要命名空间
using System.Reflection; using System.Linq;
第二步:实现GetSetProperties方法
public List<string> GetSetProperties () { var assignedProperties = new List<string>(); // 筛选当前类所有公共的、同时包含get/set访问器的实例属性 var properties = GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance) .Where(prop => prop.CanRead && prop.CanWrite); foreach (var prop in properties) { var currentValue = prop.GetValue(this); // 获取属性对应类型的默认值 object defaultValue = prop.PropertyType.IsValueType ? Activator.CreateInstance(prop.PropertyType) : null; // 值不等于默认值则判定为已赋值 if (!Equals(currentValue, defaultValue)) { assignedProperties.Add(prop.Name); } } return assignedProperties; }
输出格式适配
如果你需要直接输出[Nombre, Distrito]格式的结果,调用时可以这么写:
Console.WriteLine($"[{string.Join(", ", project.GetSetProperties())}]");
方案2:记录赋值操作(完全精准,不受默认值影响)
如果你的业务场景允许把属性赋值为类型默认值(比如给IdProyecto赋值为0、给字符串赋值为null),方案1会误判这些属性为未赋值。这种方案通过重写属性的set方法记录所有赋值操作,只要调用过set就会被标记为已赋值,精准度更高。
class Project { // 存储所有已赋值的属性名 private readonly HashSet<string> _assignedProps = new HashSet<string>(); private int _idProyecto; public int IdProyecto { get => _idProyecto; set { _idProyecto = value; _assignedProps.Add(nameof(IdProyecto)); } } private string _nombre; public string Nombre { get => _nombre; set { _nombre = value; _assignedProps.Add(nameof(Nombre)); } } private string _descripcion; public string Descripcion { get => _descripcion; set { _descripcion = value; _assignedProps.Add(nameof(Descripcion)); } } private string _distrito; public string Distrito { get => _distrito; set { _distrito = value; _assignedProps.Add(nameof(Distrito)); } } private string _provincia; public string Provincia { get => _provincia; set { _provincia = value; _assignedProps.Add(nameof(Provincia)); } } private string _departamento; public string Departamento { get => _departamento; set { _departamento = value; _assignedProps.Add(nameof(Departamento)); } } public List<string> GetSetProperties () { return _assignedProps.ToList(); } }
内容的提问来源于stack exchange,提问作者cantuta
相关产品推荐
相关产品推荐

