簡體   English   中英

C#如何確定包裝在對象內的值是null還是默認值?

[英]C# how to determine value wrapped within object is null or default?

我目前正在寫一個自定義的必需驗證屬性,並且當值為null或Default時,我想返回錯誤。 在默認情況下,我的意思是“”表示字符串,0表示int,0.0表示double,null表示object。

為了實現這一點,我在調用以下適用於任何類型的函數

    protected bool IsNullOrDefault<T>(T value)
    {
        return object.Equals(value, default(T));
    }

測試如下:

    object obj = null;
    bool flag = IsNullOrDefault(obj));

標志=真

    int i = 0;
    bool flag = IsNullOrDefault(i);

標志=真

    double d = 0.0;
    Console.WriteLine(IsNullOrDefault(d));

標志=真

    object value = 0;
    Console.WriteLine(IsNullOrDefault(value));

標志=假

這里的對象依次包含int內部,但仍認為它是一個對象,其默認值為null,而當前值為0 因此它返回False

問題是,我要重寫的框架方法為我提供了作為對象的值,因此它將始終與上述最后一種情況匹配。

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    { ....
    }

根據值,我們如何將對象轉換為實際類型(在這種情況下為int) 因此,即使在上述最后一種情況下,我也能收到True

您必須認識到, default返回的defaulttypeof運算符是在編譯時確定的,一旦將T推斷為object ,則總是將您的值與null進行比較。

最好的選擇是檢查運行時類型:

protected bool IsNullOrDefault<T>(T value)
{
    if (value == null)
        return true;

    var actualType = value.GetType();

    if (actualType.IsValueType)
        return value.Equals(Activator.CreateInstance(actualType));

    return false;
}
 object value = 0; Console.WriteLine(IsNullOrDefault(value)); 

在這種情況下, TSystem.Object ,因此default(T)null

您需要檢查運行時類型而不是編譯時類型來處理此問題:

public bool IsNullOrDefault(object value) {
  if (value is Int32) {
    return (Int32)value == 0;
  } else if (value is Int64) {
    return (Int64)value == 0L;
  } else if …
  } else {
    return value == null;
  }
}

涵蓋您可能遇到的所有類型。

最后,我可以通過使用dynamic類型強制轉換值來實現這一點,

    protected bool IsNullOrDefault(object obj)
    {
        bool retval = false;
        if (obj == null)
        {
            retval = true;
        }
        else
        {
            retval = IsEmpty((dynamic)obj);
        }
        return retval;
    }

    protected bool IsEmpty<T>(T value)
    {
        return object.Equals(value, default(T));
    }

您應該在要在運行時而不是在編譯時進行類型解析的地方使用dynamic類型。 因此,在這種情況下,值self會在不通知我們的情況下適當地確定其類型。

暫無
暫無

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

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