Mi clase tiene la siguiente estructura (encogida a las partes irrelevantes omitidas):

public class MyClass<T>
{
    private T svalue;
    private Predicate<T> spredicate;

    private void Update(T nvalue)
    {
        if(spredicate(nvalue))
            svalue = nvalue;
    }

    public MyClass(Predicate<T> condition){
        spredicate = condition;
    }

    public T Value
    {
        get { return svalue; }
        set { Update(value); }
    }
}

Básicamente, almacena un valor, y solo permite cambiarlo si el nuevo valor se adapta a un predicado.

Quiero que funcione el siguiente código:

var myvar = new MyClass<int>(x => Math.Abs(x - myvar.Value < 10));

Sin embargo, esto no compila porque "estoy usando una variable local que el valor no se estableció todavía".

Al final, quiero poder hacer referencia a una propiedad de clase pública en ese predicado. ¿Hay una manera de hacer eso?

c#
0
TheLeftExit 27 jun. 2019 a las 17:58

1 respuesta

La mejor respuesta

Si desea que su predicado tenga una referencia a una instancia de clase, pasarla:

public class MyClass<T>
{
    private T svalue;
    private Func<MyClass<T>, T, bool> spredicate;

    private void Update(T nvalue)
    {
        if (spredicate(this, svalue))
            svalue = nvalue;
    }

    public MyClass(Func<MyClass<T>, T, bool> condition)
    {
        spredicate = condition;
    }

    public T Value
    {
        get { return svalue; }
        set { Update(value); }
    }

    public static void Example()
    {
        var myvar = new MyClass<int>((self, newval) => Math.Abs(newval - self.svalue) < 10);
    }
}

En su lugar, podríamos dar al predicado un segundo parámetro T en lugar de MyClass<T>, pero luego habría confusión sobre qué parámetro es el valor anterior y cuál es el nuevo.

1
15ee8f99-57ff-4f92-890c-b56153 27 jun. 2019 a las 15:21