我是拉姆達的新手,所以如果我在描述中遺漏了重要信息,請告訴我。我會盡可能保持簡單。.net lambda表達式 - 此參數來自哪裏?
我正在檢查別人的代碼,他們有一個類從另一個繼承。這裏的派生類第一,與我唔明lambda表達式一起:以上
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」到「這個」,因爲SampleViewModel從ViewModelBase繼承,但我遇到了一系列的編譯器錯誤的,其中第一個陳述的Invalid expression term '=>'
這讓我感到困惑了一下,因爲我認爲這將工作。
任何人都可以解釋這裏發生了什麼?
啊,好的。所以這是一個方法聲明。我認爲有問題的片段是 - 在那一刻 - 用'p'作爲參數調用NotifyPropertyChanged()。謝謝大家,我的眼睛一定很累。 – larryq
不,你不能使用'this',因爲它是一個保留關鍵字。它永遠不會作爲參數名稱有效。 – jason
@larryq:它調用NotifyPropertyChanged,它帶有*表達式樹*,它有一個*參數*,稱爲p。除了可以從NotifyPropertyChanged中分離形式參數「屬性」的聲明外,沒有任何辦法可以將lambda與p分開。 –