如何检查.net中的框值是否为空
本文关键字:是否 net 何检查 检查 | 更新日期: 2023-09-27 18:14:14
例如
输入参数类型为object
。我知道这个参数可以存储一个值类型int, float, double
(盒装值)等。但我不知道这个方法会用到哪种值类型。我想检查框值类型是否为空
就像这段代码:
bool IsEmpty(object boxedProperty)
{
return boxedProperty == default(typeof(boxedProperty))
}
我明白了,我可以这样做:
bool IsEmpty(object boxedProperty)
{
return boxedProperty is int && boxedProperty == default(int)
|| boxedProperty is float ....
}
但它看起来像脏溶液。如何做得更好?
我想这样的东西可以给你一个引用+框值类型的结果。
public bool IsDefaultValue(object o)
{
if (o == null)
return true;
var type = o.GetType();
return type.IsValueType && o.Equals(Activator.CreateInstance(type));
}
object i = default(int);
object j = default(float);
object k = default(double);
object s = default(string);
object i2 = (int)2;
object s2 = (string)"asas";
var bi = IsDefaultValue(i); // true
var bj = IsDefaultValue(j); // true
var bk = IsDefaultValue(k); // true
var bs = IsDefaultValue(s); // true
var bi2 = IsDefaultValue(i2); // false
var bs2 = IsDefaultValue(s2); // false
如果你确信你有一个值类型,那么使用这个方法:
public bool IsDefaultBoxedValueType(object o)
{
return o.Equals(Activator.CreateInstance(o.GetType()));
}
正如其他人指出的那样,唯一真正的方法是创建该类型的实例,然后对其进行比较。(请参阅如果类型仅为System.Type,如何获取该类型的默认值?)(运行时类型的默认值)
你可以缓存结果,这样你只需要创建一个默认的实例类型。这可以提高效率,如果你需要多次调用支票。我使用了一个静态方法和字典(它不是线程安全的),但是如果你想的话,你可以将它更改为实例级。
static IDictionary<Type, object> DefaultValues = new Dictionary<Type, object>();
static bool IsBoxedDefault(object boxedProperty)
{
if (boxedProperty == null)
return true;
Type objectType = boxedProperty.GetType();
if (!objectType.IsValueType)
{
// throw exception or something else?? Up to how you want this to behave
return false;
}
object defaultValue = null;
if (!DefaultValues.TryGetValue(objectType, out defaultValue))
{
defaultValue = Activator.CreateInstance(objectType);
DefaultValues[objectType] = defaultValue;
}
return defaultValue.Equals(boxedProperty);
}
测试代码
static void Test()
{
Console.WriteLine(IsBoxedDefault(0)); // true
Console.WriteLine(IsBoxedDefault("")); // false (reference type)
Console.WriteLine(IsBoxedDefault(1));// false
Console.WriteLine(IsBoxedDefault(DateTime.Now)); // false
Console.WriteLine(IsBoxedDefault(new DateTime())); // true
}
看起来像一个通用函数是一个很好的方法。与相似的
static void Main(string[] args)
{
object obj1 = null;
object obj2 = "Assigned value";
Console.WriteLine(string.Format("IsEmpty(obj1) --> {0}", IsEmpty(obj1)));
Console.WriteLine(string.Format("IsEmpty(obj2) --> {0}", IsEmpty(obj2)));
Console.ReadLine();
}
private static bool IsEmpty<T>(T boxedProperty)
{
T defaultProperty = default(T);
return ReferenceEquals(boxedProperty, defaultProperty);
}
输出:
IsEmpty(obj1) --> True
IsEmpty(obj1) --> False