有没有办法找出是否已设置属性或变量?

时间:2010-12-23 12:34:15

标签: c# reflection variables properties

根据标题,我可以找出属性或变量的历史记录,无论是否已设置?

原因是我有一些查询类,任何尚未设置的属性都不应包含在生成的查询中。

目前我只是尝试将一个PropertyInfo实例(我需要属性的名称,这对于由于映射而生成的查询至关重要)添加到已在set {}中设置的属性列表。这是丑陋的,因为它需要更多的代码,什么应该是只包含属性和没有逻辑的类(即不从列表中删除东西)。

我可以使用内置的内容还是更优雅的方法?

2 个答案:

答案 0 :(得分:4)

假设您正在讨论动态实体,您可以使用反射检查null,但如果原始值为null(或者在数值数据类型的情况下为零),则不会告诉您任何内容。

最佳方式是让它实现INotifyPropertyChanged并拥有已实现的属性列表。

public class Item : INotifyPropertyChanged
{
    private List<string> _MaterializedPropertiesInternal;
    private List<string> MaterializedPropertiesInternal
    {
        get
        {
            if (_MaterializedPropertiesInternal==null) 
                _MaterializedPropertiesInternal = new List<string>();
            return _MaterializedPropertiesInternal;
        }
    }

    private ReadOnlyCollection<string> _MaterializedProperties;
    public IEnumerable<string> MaterializedProperties
    {
        get 
        {
            if (_MaterializedProperties==null) _MaterializedProperties = 
              new ReadOnlyCollection<string>(MaterializedPropertiesInternal);
            return _MaterializedProperties;
        }
    }

    private int _MyProperty;
    public int MyProperty
    {
        get { return _MyProperty; }
        set
        {
            _MyProperty = value;
            OnPropertyChanged("MyProperty");
        }
    }

    protected void OnPropertyChanged(string propertyName)
    {
        if(PropertyChanged != null) PropertyChanged(this, 
          new PropertyChangedEventArgs(propertyName));
        MaterializedPropertiesInternal.Add(propertyName);
    }


    public event PropertyChangedEventHandler PropertyChanged;
}

答案 1 :(得分:3)

使属性可以为空,例如类型int?而不是int类型,如果尚未设置,则其值为null