.Net lambda expression- откуда взялся этот параметр?

Я новичок в лямбда, так что если я упускаю важную информацию в своем описании, пожалуйста, скажите мне. Я буду приводить пример как можно проще.

Я просматриваю чужой код, и у него один класс наследуется от другого. Вот производный класс сначала, вместе с лямбда-выражением, которое я не могу понять:

    class SampleViewModel : ViewModelBase
{
    private ICustomerStorage storage = ModelFactory<ICustomerStorage>.Create();

    public ICustomer CurrentCustomer
    {
        get { return (ICustomer)GetValue(CurrentCustomerProperty); }
        set { SetValue(CurrentCustomerProperty, value); }
    }

    private int quantitySaved;
    public int QuantitySaved
    {
        get { return quantitySaved; }
        set
        {
            if (quantitySaved != value)
            {
                quantitySaved = value;
                NotifyPropertyChanged(p => QuantitySaved); //where does 'p' come from?
            }
        }
    }

    public static readonly DependencyProperty CurrentCustomerProperty;

    static SampleViewModel()
    {
        CurrentCustomerProperty = DependencyProperty.Register("CurrentCustomer", typeof(ICustomer),
            typeof(SampleViewModel), new UIPropertyMetadata(ModelFactory<ICustomer>.Create()));
    }
//more method definitions follow..

Обратите внимание на вызов NotifyPropertyChanged(p => QuantitySaved) бит выше. Я не понимаю, откуда берется "p".

Вот базовый класс:

  public abstract class ViewModelBase : DependencyObject, INotifyPropertyChanged, IXtremeMvvmViewModel
    {
        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void NotifyPropertyChanged<T>(Expression<Func<ViewModelBase, T>> property)
        {
            MvvmHelper.NotifyPropertyChanged(property, PropertyChanged);
        }
    }

Там много всего, что не относится к вопросу, я уверен, но я хотел сделать ошибку на стороне инклюзивности.

Проблема в том, что я не понимаю, откуда взялся параметр 'p', и как компилятор догадался (очевидно?) заполнить значение типа ViewModelBase из воздуха?

Ради интереса я изменил код с 'p' на 'this', поскольку SampleViewModel наследуется от ViewModelBase, но столкнулся с серией ошибок компилятора, первая из которых гласилаInvalid expression term '=>' Это меня немного смутило, поскольку я думал, что это будет работать.

Кто-нибудь может объяснить, что здесь происходит?

17
задан larryq 30 November 2011 в 17:42
поделиться