如何创建一个使用允许可空和非可空类型的泛型类的类

时间:2010-10-11 14:32:41

标签: c# generics nullable

我正在尝试创建一个类作为其他对象中的字段,可以保存临时未保存的值,直到在对象上调用SaveChanges方法,这样我就可以将值传递给存储过程,这将是使用新值更新任何非空字段,并保留以null为原始值的字段。

我希望能够做到这一点:

private Field<int> MyInt;
private Field<int?> MyNullableInt;
private Field<string> MyString;

然后能够像这样使用Field对象:

MyInt = new Field<int>(1);    // initialise with a value
MyInt.Value = 2;              // assign a new value internally marking it as having a new value
int x = MyInt.Value;          // read the current value
int? newInt = MyInt.NewValue; // read the newly set value, or null if there is no new value

我希望能够创建以下字段:

  • 在db中具有NOT NULL约束的值类型,例如int,bool等。
  • 值类型,例如int?,bool?等,允许在db中使用NULL。
  • 始终可以为空的引用类型,例如字符串。

我还在学习泛型,但是我开始理解它们了,但是,我有点困惑于此,因为我可以根据需要在上面创建一个与非可空类型一起使用的Field对象,或者可以为空的类型,但不是两者。

这是我到目前为止所提出的:

protected class Field<T> where T : struct {
    private T _Field;
    private bool _IsNew;

    public Field(T InitialValue) {
        _Field = InitialValue;
        _IsNew = false;
    }

    public T Value {
        get { return _Field; }
        set { 
            if (!_Field.Equals(value)) { 
                _Field = value; 
                _IsNew = true; 
            } 
        }
    }

    public Nullable<T> NewValue {
        get {
            if (_IsNew) {
                _IsNew = false;
                return _Field;
            }
            return null; 
        }
    }

    public bool IsNew { get { return _IsNew; } }

}

这很有效。我还可以将类型约束更改为where T : class,并在NewValue方法上将Nullable<T>更改为T,这使得它可以使用可空类型,但是如何让它适用于所有类型数据类型?我真的需要创建两个不同的类来处理两种不同的场景吗?

谢谢, 本

1 个答案:

答案 0 :(得分:2)

什么阻止你做你想做的事情?我的猜测是那里的约束。如果你放弃它我不明白是什么问题。

修改

你无法双管齐下。要么泛型类知道有关为值赋值的空值,然后你不能将值类型(如int)作为允许类型,或者你不能。

如果前者是这种情况,你的泛型类需要约束,你不能将它用于像int这样的值类型

在后一种情况下,不需要约束,您仍然可以为值 IF 赋值null通用参数是引用类型