C#谓词,返回装箱值类型是否为该类型的默认值

C#谓词,返回装箱值类型是否为该类型的默认值,c#,boxing,C#,Boxing,是否可以创建一个采用装箱值类型并返回该值类型是否等于该类型默认值的方法? 因此,我想创建一个具有以下签名的方法: bool IsDefault(object boxedValueType); 注意:当T设置为typeobject时,以下代码将不起作用,因此default(T)将始终为null bool IsDefault<T>(T input) { return Equals(input, default(T)); } bool IsDefault(T输入) { 返回等于

是否可以创建一个采用装箱值类型并返回该值类型是否等于该类型默认值的方法?

因此,我想创建一个具有以下签名的方法:

bool IsDefault(object boxedValueType);
注意:当T设置为type
object
时,以下代码将不起作用,因此
default(T)
将始终为
null

bool IsDefault<T>(T input)
{
    return Equals(input, default(T));
}
bool IsDefault(T输入)
{
返回等于(输入,默认值(T));
}

您可能更适合使用可为空的类型,而不是装箱的默认值。测试
null
很容易,可空类型通常比特殊值更简洁。使用可空类型而不是装箱的默认值可能更合适。测试
null
很容易,可为null的类型通常比特殊值更简洁。可以使用反射来获取类型的默认值。请参见关于通过反射获取默认值。将对默认值(T)的调用替换为对该函数的调用:

return input.Equals(GetDefault(input.GetType());

您可以使用反射来获取类型的默认值。请参见关于通过反射获取默认值。将对默认值(T)的调用替换为对该函数的调用:

return input.Equals(GetDefault(input.GetType());

使用反射,但这是一种缓慢的方法

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("1 = " + IsDefault(1));
        Console.WriteLine("0 = " + IsDefault(default(int)));

        Console.WriteLine("1.0 = " + IsDefault(1.0));
        Console.WriteLine("0.0 = " + IsDefault(default(double)));

        Console.WriteLine("Today = " + IsDefault(DateTime.Today));
        Console.WriteLine("1.1.1 = " + IsDefault(default(DateTime)));

        //Console.WriteLine(IsDefault(""));
        //Console.WriteLine(IsDefault(default(string)));

        Console.ReadKey();
    }

    static bool IsDefault(object boxedValueType)
    {
        if (boxedValueType == null) throw new ArgumentNullException("boxedValueType");

        var t = boxedValueType.GetType();
        if (!t.IsValueType) throw new ArgumentOutOfRangeException("boxedValueType");

        object def = Activator.CreateInstance(t);
        return boxedValueType.Equals(def);
    }
}

使用反射,但这是一种缓慢的方法

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("1 = " + IsDefault(1));
        Console.WriteLine("0 = " + IsDefault(default(int)));

        Console.WriteLine("1.0 = " + IsDefault(1.0));
        Console.WriteLine("0.0 = " + IsDefault(default(double)));

        Console.WriteLine("Today = " + IsDefault(DateTime.Today));
        Console.WriteLine("1.1.1 = " + IsDefault(default(DateTime)));

        //Console.WriteLine(IsDefault(""));
        //Console.WriteLine(IsDefault(default(string)));

        Console.ReadKey();
    }

    static bool IsDefault(object boxedValueType)
    {
        if (boxedValueType == null) throw new ArgumentNullException("boxedValueType");

        var t = boxedValueType.GetType();
        if (!t.IsValueType) throw new ArgumentOutOfRangeException("boxedValueType");

        object def = Activator.CreateInstance(t);
        return boxedValueType.Equals(def);
    }
}

使用反射,可以使用值的类型调用泛型方法:

public static bool IsDefault(object value)
{
    if (value == null)
    {
        throw new ArgumentNullException("value");
    }
    return (bool)typeof(Program).GetMethod("IsDefaultGeneric")
                                .MakeGenericMethod(value.GetType())
                                .Invoke(null, new object[] { value });
}

public static bool IsDefaultInternal<T>(T value)
    where T : struct, IEquatable<T>
{
    return value.Equals(default(T));
}
公共静态bool IsDefault(对象值)
{
如果(值==null)
{
抛出新的ArgumentNullException(“值”);
}
返回(bool)类型的(程序).GetMethod(“IsDefaultGeneric”)
.MakeGenericMethod(value.GetType())
.Invoke(null,新对象[]{value});
}
公共静态布尔值为默认值(T值)
其中T:struct,i可满足
{
返回值。等于(默认值(T));
}

使用反射,可以使用值的类型调用泛型方法:

public static bool IsDefault(object value)
{
    if (value == null)
    {
        throw new ArgumentNullException("value");
    }
    return (bool)typeof(Program).GetMethod("IsDefaultGeneric")
                                .MakeGenericMethod(value.GetType())
                                .Invoke(null, new object[] { value });
}

public static bool IsDefaultInternal<T>(T value)
    where T : struct, IEquatable<T>
{
    return value.Equals(default(T));
}
公共静态bool IsDefault(对象值)
{
如果(值==null)
{
抛出新的ArgumentNullException(“值”);
}
返回(bool)类型的(程序).GetMethod(“IsDefaultGeneric”)
.MakeGenericMethod(value.GetType())
.Invoke(null,新对象[]{value});
}
公共静态布尔值为默认值(T值)
其中T:struct,i可满足
{
返回值。等于(默认值(T));
}

如果只想使用默认构造函数作为默认值,则可以

bool IsDefault<T>(T input)
{
    return EqualityComparer<T>.Default.Equals(value, Activator.CreateInstance<T>());
}
bool IsDefault(T输入)
{
返回EqualityComparer.Default.Equals(值,Activator.CreateInstance());
}

如果只想使用默认构造函数作为默认值,则可以

bool IsDefault<T>(T input)
{
    return EqualityComparer<T>.Default.Equals(value, Activator.CreateInstance<T>());
}
bool IsDefault(T输入)
{
返回EqualityComparer.Default.Equals(值,Activator.CreateInstance());
}

代码+单元测试,它将告诉您已装箱还是未装箱的对象是其默认值。还包括通用版本

    [Test]
    public void BoxedIntIsDefault()
    {
        Assert.That(IsDefault((object)0), Is.True);
        Assert.That(IsDefault((object)1), Is.False);
        Assert.That(IsDefault<object>(0), Is.True);
        Assert.That(IsDefault<object>(1), Is.False);

    }
    bool IsDefault(object obj)
    {
        return Equals(obj, GetDefault(obj.GetType()));                
    }

    bool IsDefault<T>(T input)
    {
        return Equals(input, GetDefault(input.GetType()));
    }

    public static object GetDefault(Type type)
    {
        if (type.IsValueType)
        {
            return Activator.CreateInstance(type);
        }
        return null;
    }
[测试]
public void BoxedIntIsDefault()
{
Assert.That(IsDefault((object)0)为.True);
Assert.That(IsDefault((object)1)为.False);
Assert.That(IsDefault(0),Is.True);
Assert.That(IsDefault(1),Is.False);
}
布尔IsDefault(对象对象对象)
{
返回等于(obj,GetDefault(obj.GetType());
}
布尔IsDefault(T输入)
{
返回等于(input,GetDefault(input.GetType());
}
公共静态对象GetDefault(类型)
{
if(type.IsValueType)
{
返回Activator.CreateInstance(类型);
}
返回null;
}

代码+单元测试,它将告诉您已装箱还是未装箱的对象是其默认值。还包括通用版本

    [Test]
    public void BoxedIntIsDefault()
    {
        Assert.That(IsDefault((object)0), Is.True);
        Assert.That(IsDefault((object)1), Is.False);
        Assert.That(IsDefault<object>(0), Is.True);
        Assert.That(IsDefault<object>(1), Is.False);

    }
    bool IsDefault(object obj)
    {
        return Equals(obj, GetDefault(obj.GetType()));                
    }

    bool IsDefault<T>(T input)
    {
        return Equals(input, GetDefault(input.GetType()));
    }

    public static object GetDefault(Type type)
    {
        if (type.IsValueType)
        {
            return Activator.CreateInstance(type);
        }
        return null;
    }
[测试]
public void BoxedIntIsDefault()
{
Assert.That(IsDefault((object)0)为.True);
Assert.That(IsDefault((object)1)为.False);
Assert.That(IsDefault(0),Is.True);
Assert.That(IsDefault(1),Is.False);
}
布尔IsDefault(对象对象对象)
{
返回等于(obj,GetDefault(obj.GetType());
}
布尔IsDefault(T输入)
{
返回等于(input,GetDefault(input.GetType());
}
公共静态对象GetDefault(类型)
{
if(type.IsValueType)
{
返回Activator.CreateInstance(类型);
}
返回null;
}