Muk*_*ani 1 c# null object default-value validationattribute
我目前正在编写自定义所需的验证属性,并且我想在值为 null 或默认值时恢复错误。对于默认值,我的意思是“”代表字符串,0代表整数,0.0代表双精度,空代表对象。
为了实现这一目标,我调用以下函数,该函数适用于任何类型
protected bool IsNullOrDefault<T>(T value)
{
return object.Equals(value, default(T));
}
Run Code Online (Sandbox Code Playgroud)
以下是测试:
object obj = null;
bool flag = IsNullOrDefault(obj));
Run Code Online (Sandbox Code Playgroud)
标志=真
int i = 0;
bool flag = IsNullOrDefault(i);
Run Code Online (Sandbox Code Playgroud)
标志=真
double d = 0.0;
Console.WriteLine(IsNullOrDefault(d));
Run Code Online (Sandbox Code Playgroud)
标志=真
object value = 0;
Console.WriteLine(IsNullOrDefault(value));
Run Code Online (Sandbox Code Playgroud)
标志=假
这里对象内部又包含了int,但它仍然认为它是一个对象,其默认值为null,当前值为0。所以它返回False。
问题是,我要重写的框架方法为我提供了对象值,因此它将始终与上面提到的最后一个场景相匹配。
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{ ....
}
Run Code Online (Sandbox Code Playgroud)
根据值,我们如何将对象转换为实际类型(在本例中为int )?因此,即使对于上面的最后一个场景,我也会收到True 。
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;
}
Run Code Online (Sandbox Code Playgroud)