假设我有一个C#类,它有多个属性,如下所示:
private bool _var1Dirty = true;
private Double? _var1;
public Double? Var1
{
get
{
if (_var1Dirty)
{
_var1 = Method_Var1();
_var1Dirty = false;
}
return _var1;
}
}
每个属性之间的唯一区别是:
Double?
,但可以很容易int
,string
等)Method_Var1()
(每个属性都有不同的属性)有什么方法可以把它写成自定义类吗?
有些事情:
public class Prop
{
public delegate T Func();
private bool _dirty = true;
private T _val;
public T Val
{
get
{
if (_dirty)
{
_val = Func;
_dirty = false;
}
return _val;
}
}
}
然后我可以传入:
T
Func
(PS - 我知道这不会编译/错误,但我想知道我在寻找什么)
非常感谢任何帮助/指导。
感谢!!!
答案 0 :(得分:3)
你很亲密。你可以按照以下方式做点什么:
public class Dirty<T>
{
public Dirty(Func<T> valueFactory)
{
this.valueFactory = valueFactory;
dirty = true;
}
private Func<T> valueFactory;
private bool dirty;
private T value;
public T Value
{
get
{
if (dirty)
{
value = valueFactory();
dirty = false;
}
return value;
}
}
}
你就像这样消费它:
Dirty<double?> dirtyDouble = new Dirty<double?>(() => SomethingThatReturnsADouble());
double? value = dirtyDouble.Value;
我不确定脏检查实际上做了什么,但是如果你需要比bool
更复杂的人,你总是可以将它变成某些Func<T>
检查肮脏。
修改强>
鉴于@mikez评论和你的回答,你可以使用内置的Lazy<T>
来保存自己Dirty<T>
类的创建,这也保证了线程安全:
public class F
{
private Lazy<double?> lazyDouble = new Lazy<double?>(() =>
MethodThatReturnsNullableDouble(), true);
public double? Value
{
get
{
return lazyDouble.Value;
}
}
}