如何检查.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 ....
}

但它看起来像脏溶液。如何做得更好?

如何检查.net中的框值是否为空

我想这样的东西可以给你一个引用+框值类型的结果。

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