C# FieldWrapper<;T>;图案

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

我有一个类似的类,它基本上是用来包装一个基类型(int,long,bool,string,…),并跟踪它是否被修改过

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