考虑我的第一次尝试,像下面这样的简单类型在F#:如何在F#中正确实现一个属性?
type Test() =
inherit BaseImplementingNotifyPropertyChangedViaOnPropertyChanged()
let mutable prop: string = null
member this.Prop
with public get() = prop
and public set value =
match value with
| _ when value = prop ->()
| _ ->
let prop = value
this.OnPropertyChanged("Prop")
现在我通过C#测试此(此对象被暴露于C#项目,所以表观C#语义是期望的):
[TestMethod]
public void TaskMaster_Test()
{
var target = new FTest();
string propName = null;
target.PropertyChanged += (s, a) => propName = a.PropertyName;
target.Prop = "newString";
Assert.AreEqual("Prop", propName);
Assert.AreEqual("newString", target.Prop);
return;
}
propName
已正确分配,我的F#Setter正在运行,但第二个断言失败,因为基础值prop
没有更改。这种情况对我来说很有意义,因为如果我从prop
字段中删除mutable
,则不会生成错误(并且应该是因为我试图修改该值)。我想我必须错过一个基本概念。
在Test
类中重新绑定/变异prop
的正确方法是什么,以便我可以通过我的单元测试?
谢谢,@kvb。没有什么让我觉得自己像一个简单的解决方案,在语言上像一个n00b。 :) – 2010-04-02 15:00:59
@Greg - 没问题。绑定和隐藏工作的方式可能需要一些习惯,特别是因为其他语言做得如此不同。但是,一旦你的思维模式变得直白,我认为F#方法的优雅就会变得明显。 – kvb 2010-04-02 15:06:28