You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 17:24:00