Pregunta

Tenga en cuenta mi primer intento, un tipo simple en C # como la siguiente:

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. Este tipo de sentido para mí, porque si quito mutable del campo prop, no se genera un error (y uno debe ser porque estoy tratando de mutar el valor). Creo que debe estar pasando un concepto fundamental.

¿Cuál es la forma correcta de volver a enlazar / prop mutan en la clase Test para que pueda pasar a mi unidad de prueba?

¿Fue útil?

Solución

Prueba esto:

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")

Usted necesita hacer lo mutable vinculante y luego alterar su valor en su colocador. En su código inicial, que se acaba de crear una nueva unión (también llamado prop) dentro de su organismo, por lo que no era visible el cambio.

Otros consejos

Como nota lateral, probablemente utilizar if .. then en lugar de la construcción match ya que hace que el código sea más sucinta (coincidente patterh es especialmente valiosa cuando se necesita para poner a prueba los agains de valor múltiples patrones complejos). Además, public es el acceso predeterminado para member, por lo que puede hacer que el código un poco más sucinta:

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") 

En el ajuste de patrones en realidad se está atando un nuevo valor con

let prop = value

Cuando se enlaza un valor de este tipo con el mismo nombre, que ocultará el otro valor para el ámbito de la recién declarada una. Creo que lo que realmente quiere hacer es la siguiente:

prop <- value
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top