[英]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
返回的default
和typeof
運算符是在編譯時確定的,一旦將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));
在這種情況下, T
為System.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.