【发布时间】:2011-06-16 14:01:43
【问题描述】:
(使用 C# 3.0 和 VS 2008)。
做 MVVM WPF 的东西你经常写这样的属性:
public bool MyProperty {
get{return _myProperty;}
set{
if(_myProperty == value)return;
_myProperty = value;
RaisePropertyChanged("MyProperty");
}
}
在做 TDD 时,我经常会编写如下测试:
[Test]
public void MyPropertyRaisesPropertyChangedWhenChanged(){
var mySUT = CreateSUT();
bool eventRaised = false;
string propName = "";
mySUT.PropertyChanged +=
(s,e)=>{eventRaised = true;propName = e.PropertyName;};
Assert.That(mySUT.MyProperty,Is.False(),"mySUT.MyProperty");
mySUT.MyProperty = true;
Assert.That(eventRaised,"eventRaised");
Assert.That(propName, Is.EqualTo("MyProperty"),"propName");
// could check not raised when set same...
}
我尝试了这样的方法:
public class MyTestMethods{
public static PropertyChangedEventHandler MakePropertyChangedHandler(
bool eventWasRaised, string propertyName){
return (s,e)=>{eventWasRaised = true; propertyName = e.PropertyName};
}
}
这样我就可以编写测试了:
[Test]
public void MyPropertyRaisesPropertyChangedWhenChanged(){
var mySUT = CreateSUT();
bool eventRaised = false;
string propName = "";
mySUT.PropertyChanged +=
MyTestMethods.MakePropertyChangedHandler(eventRaised,propName);
// etc...
}
但是 VS2008 告诉我 eventRaised 总是错误的。
我想也许改变 MakePropertyChangedHandler 以使用 ref 参数会起作用
public static PropertyChangedEventHandler MakePropertyChangedHandler(
ref bool eventWasRaised, ref string propertyName){
return // lambda...
}
但 VisualStudio 告诉我“不能在匿名方法主体内使用 ref 或 out 参数 'x'”。
谁能告诉我是否可以编写像 MakePropertyChangedHandler 这样的工作方法,如果没有,怎么会?
【问题讨论】:
-
这有问题的原因,请参阅stackoverflow.com/questions/1365689/…
-
@Justin,感谢您的链接。
标签: c# lambda parameter-passing