簡體   English   中英

如何創建使用允許空值和非空值類型的通用類型的類

[英]How to create a class that uses a generic type that allows nullable and non-nullable types

我正在嘗試創建一個類以用作其他對象中的字段,該對象可以保存臨時的未保存值,直到對該對象調用SaveChanges方法為止,以便可以將該值傳遞給存儲的proc,該proc將更新任何-null具有新值的字段,並保留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

我希望能夠創建以下字段:

  • 值類型,例如int,bool等,它們在db中具有NOT NULL約束。
  • 值類型,例如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 ,這使得它可以與可空類型一起使用,但是如何使它與所有數據類型一起使用? 我是否真的需要創建兩個不同的類來處理兩種不同的情況?

謝謝,本

什么阻礙了您做自己想做的事情? 我猜這是在哪里約束。 如果將其丟棄,我看不出問題所在。

編輯

您不能同時擁有這兩種方式。 泛型類要么知道一些有關將空值分配給值的知識,然后就不能將值類型(如int)作為允許的類型,否則就不知道。

如果是前一種情況,則您的泛型類需要約束,並且您不能將其用於諸如int之類的值類型

在后一種情況下,不需要約束,並且如果泛型參數表是引用類型,則仍可以將null分配給值

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM