首页 > 解决方案 > 如何在作为类属性的谓词中使用类属性?

问题描述

我的班级具有以下结构(缩小了省略的不相关部分):

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); }
    }
}

基本上,它存储一个值,并且仅在新值适合谓词时才允许更改它。

我希望以下代码工作:

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

但是,这不会编译,因为“我正在使用尚未设置值的局部变量”。

最后,我希望能够在该谓词中引用公共类属性。有没有办法做到这一点?

标签: c#

解决方案


如果您希望您的谓词具有对类实例的引用,请将其传入:

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);
    }
}

我们可以给谓词提供第二个T参数而不是MyClass<T>,但是会混淆哪个参数是旧值,哪个是新值。


推荐阅读