首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何创建使用允许空和非空类型的泛型类型的类

如何创建使用允许空和非空类型的泛型类型的类
EN

Stack Overflow用户
提问于 2010-10-11 14:32:41
回答 1查看 404关注 0票数 0

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

我想要做到这一点:

代码语言:javascript
复制
private Field<int> MyInt;
private Field<int?> MyNullableInt;
private Field<string> MyString;

然后能够使用这样的字段对象:

代码语言:javascript
复制
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

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

  • 值类型,如int、bool等,这些类型在db.
  • 值类型(如int?、bool?等)中具有非空约束,这些类型允许在db.
  • 引用类型(如字符串)中始终为空。

我仍然在学习泛型,但是我开始理解它们,然而,我对此有点执着,因为我可以在上面创建一个需要的Field对象,它可以用于非空类型,或者是可空类型,但不能同时使用。

这就是我到目前为止想出的:

代码语言:javascript
复制
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,并将Nullable<T>更改为NewValue方法上的T,这使得它可以处理可空类型,但是如何使它与所有数据类型一起工作呢?我真的需要创建两个不同的类来处理这两个不同的场景吗?

谢谢,本

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-10-11 14:40:03

什么能阻止你做你想做的事?我猜是在哪里的约束。如果你放下它,我看不出是什么问题。

编辑

你不能两全其美。或者您的泛型类知道有关赋值给值的一些信息,然后您不能将值类型(如int)作为允许的类型,或者您不知道。

如果是前者,则泛型类需要约束,并且不能将其用于int之类的值类型。

在后一种情况下,不需要约束,如果泛型参数是引用类型的,则仍然可以将null赋值为值。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3907159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档