considerar mi primer intento, un tipo simple en F # como el siguiente:¿Cómo implemento correctamente una propiedad en 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")
Ahora probar esta vía C# (este objeto está siendo expuesto a un proyecto de C#, así aparentes C# semántica son deseables):
[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
está asignado correctamente, mi F # Setter está en marcha, pero la segunda aserción está fallando debido a que el valor subyacente de prop
no se cambia. Esto tiene sentido para mí, porque si elimino mutable
del campo prop
, no se genera ningún error (y uno debe ser porque estoy tratando de modificar el valor). Creo que me falta un concepto fundamental.
¿Cuál es la forma correcta de volver a vincular/mutar prop
en la clase Test
para que pueda pasar la prueba de mi unidad?
Gracias, @kvb. Nada me hace sentir como un n00b en el lenguaje de una solución tan simple como eso. :) –
@Greg - no hay problema. La forma en que funcionan las encuadernaciones y el sombreado puede llevar un tiempo acostumbrarse, especialmente porque otros lenguajes hacen las cosas de manera tan diferente. Sin embargo, una vez que obtenga su modelo mental correctamente, creo que la elegancia del enfoque de F # se hace evidente. – kvb