考虑我的第一次尝试,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
的基础值未更改。这种方式对我来说很有意义,因为如果我从mutable
字段中删除prop
,则不会产生错误(一个应该是因为我试图改变该值)。我想我一定错过了一个基本概念。
在prop
课程中重新绑定/变异Test
的正确方法是什么,以便我可以通过单元测试?
答案 0 :(得分:9)
作为旁注,我可能会使用if .. then
而不是match
构造,因为它使代码更简洁(当您需要再次测试多个复杂值时,patterh匹配特别有用)模式)。此外,public
是member
的默认访问权限,因此您可以使代码更简洁:
type Test() =
inherit BaseImplementingNotifyPropertyChangedViaOnPropertyChanged()
let mutable prop : string = null
member this.Prop
with get() = prop
and set(value) =
if value <> prop then
prop <- value
this.OnPropertyChanged("Prop")
答案 1 :(得分:8)
试试这个:
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 -> ()
| _ ->
prop <- value
this.OnPropertyChanged("Prop")
您需要使绑定变为可变,然后在您的setter中更改其值。在您的初始代码中,您只是在setter中创建了一个新绑定(也称为prop
),因此没有可见的更改。
答案 2 :(得分:5)
在模式匹配中,您实际上是使用
绑定新值let prop = value
当您使用相同的名称绑定此类值时,它将为新声明的值的范围隐藏另一个值。我相信你真正想要做的是:
prop <- value