C# FieldWrapper<;T>;图案
我有一个类似的类,它基本上是用来包装一个基类型(int,long,bool,string,…),并跟踪它是否被修改过C# FieldWrapper<;T>;图案,c#,C#,我有一个类似的类,它基本上是用来包装一个基类型(int,long,bool,string,…),并跟踪它是否被修改过 public class FieldWrapper<T> { public bool HasBeenModified = false; private T _value; public T Value { get { return _value; }
public class FieldWrapper<T>
{
public bool HasBeenModified = false;
private T _value;
public T Value
{
get
{
return _value;
}
set
{
if ((_value == null && value != null) || (_value != null && !_value.Equals(value)))
{
this.HasBeenModified = true;
_value = value;
}
}
}
}
这几乎都是完美和美好的,但是一件事
public class MyClass
{
public FieldWrapper<int> a = new FieldWrapper<int>();
public FieldWrapper<int> b = new FieldWrapper<int>();
public void DoThings()
{
a = 2+1;
b = a;
}
}
数据库中还有一个名为“DbClass1”的表,其中“exampleField”为整数列。
使用自动生成的查询读取此类并将其保存到数据库中。
当对象自上次加载后没有更改时,我希望避免不必要的更新查询
并且可能只更新真正更改的字段(我正在重新考虑这一部分,因为对于项目集合而言,批量更新可能比单个准时更新更有效,对于单个更新而言,可能不值得为代码增加复杂性)
所以,我基本上只需要一个布尔值,让类(不是每个字段)来表示这个对象/记录是否需要更新或不需要更新
我的第一个猜测是
类别DbClass1
{
私有bool hasBeenModified=false
int _exampleField;
[DbFieldAttribute]
public int exampleField
{
get
{
return exampleField;
}
set
{
if() //check if old value is different from new value
{
hasBeenModified = true;
_exampleField= value;
}
}
}
}
如果有一种更简洁的方法可以做到这一点,从逻辑上讲,它将是完美的,我不认为
\u value==null
应该总是意味着this.HasBeenModified=true;
。使用!\u value.Equals(value)
应该足够了。另外,在上一个示例中,b
没有定义。如果\u value
为空(如果T不是基本类型-例如字符串),我无法调用\u value.Equals
我应该检查新值是否也等于null,在这种情况下,它确实没有改变,但假定在我的应用程序中不会发生null赋值。修复b
definition:)我肯定有解决问题的方法,但您是否考虑过,“每当你发现自己在泛型中打开一个类型时,你几乎肯定是做错了什么。泛型应该是泛型的;它们应该完全独立于该类型运行。"参考。我认为这一原则适用于这里。你的问题过于宽泛。也就是说,我认为你试图将变量声明为readonly
,一开始就被误导了,只是突出了原始设计概念中的一个失败。也就是说,为什么表面上可以修改的字段会声明为readonly
意思是,当然……它在语法上是有效的,但是可变的只读的字段可能会让人困惑,尤其是当字段的整个要点是跟踪变异时。您当前的设计有很多替代方案;没有更多的上下文和约束,无法知道哪一个是最好的。谢谢您的评论!我完全同意我将编辑问题以添加上下文
public class MyClass
{
public FieldWrapper<int> a = new FieldWrapper<int>();
public FieldWrapper<int> b = new FieldWrapper<int>();
public void DoThings()
{
a = 2+1;
b = a;
}
}
class DbClass1
{
[DbFieldAttribute]
public FieldWrapper<int> exampleField;
}
int _exampleField;
[DbFieldAttribute]
public int exampleField
{
get
{
return exampleField;
}
set
{
if() //check if old value is different from new value
{
hasBeenModified = true;
_exampleField= value;
}
}
}
}