我在网上遇到了一个示例教程,并为wpf项目看到了像这样编写的类的属性。我想知道将其转换为更简单的术语是因为我之前从未见过像这样编写的类。

我尝试的翻译是否正确?意思是说教程类正在做同样的事情吗?

教程类

public ObservableCollection<string> Directories
{
    get { return Get<ObservableCollection<string>>(); }
    set { Set(value); }
}

我试图猜测它将写为
private ObservableCollection<string> _directories;
public ObservableCollection<string> Directories
{
    get
    {
        return this._directories;
    }

    set
    {
        this._directories= value;
    }
}

最佳答案

我们必须看到Get/Set实现才能正确回答这个问题,但是我想这是为了提高代码的可读性。您经常在MVVM属性中看到两件事:getter中的自动初始化和setter中的属性更改通知。

    private ObservableCollection<string> _directories;
    public ObservableCollection<string> Directories
    {
        get
        {
            // auto-initialize
            if (this._directories == null)
                this._directories = new ObservableCollection<string>();
            return this._directories;
        }
        set
        {
            this._directories = value;
            RaisePropertyChanged("Directories"); // INPC
        }
    }

如果要对大量属性进行处理,则会导致大量代码膨胀。我的猜测是,教程类中的Set和Get方法可能正在被用来自动实现这些功能,或者至少是类似的功能。以下代码将为您发布的属性提供该功能:
    private Dictionary<string, object> Properties = new Dictionary<string, object>();

    public T Get<T>([CallerMemberName] string propertyName = null)
    {
        if (!Properties.ContainsKey(propertyName))
            Properties[propertyName] = default(T);
        return (T)Properties[propertyName];
    }

    public void Set<T>(T value, [CallerMemberName] string propertyName = null)
    {
        Properties[propertyName] = value;
        RaisePropertyChanged(propertyName);
    }

09-17 00:30