c# - 如何在作为类属性的谓词中使用类属性?
问题描述
我的班级具有以下结构(缩小了省略的不相关部分):
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));
但是,这不会编译,因为“我正在使用尚未设置值的局部变量”。
最后,我希望能够在该谓词中引用公共类属性。有没有办法做到这一点?
解决方案
如果您希望您的谓词具有对类实例的引用,请将其传入:
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>
,但是会混淆哪个参数是旧值,哪个是新值。
推荐阅读
- sql - 在 SQL 中计算百分位数
- laravel - laravel 应用程序不会出现在本地主机上
- python - 在数组值上查询数据框列
- vba - 复制并粘贴下一步,没有 vba 错误
- python - 检查两个 csv 文件的两列值,如果找到匹配,则写入另一个 csv 文件
- sql - 连接两个表并找到最早的日期 SQL
- apache-kafka - Kafka Streams:混合搭配 PAPI 和 DSL KTable 不共同分区
- javascript - Ajax 回调在函数调用后触发
- machine-learning - 在 tensorflow.js 中将预测值 Y 获取到一定数量的 X 值
- json - VueJs Axios Post FormData 参数