用于检索“默认”值的通用扩展方法

本文关键字:扩展 方法 检索 默认 用于 | 更新日期: 2023-09-27 18:33:26

根据这里的例子,我正在尝试确定对象的默认值:

https://stackoverflow.com/a/3195792/1293496

此特定扩展方法是为 System.Type 创建的。我试图完成的是使它更加通用,我可以做这样的事情:

int i = 3;
bool amIaDefaultValue = i.IsDefaultValue();

我希望这在 i == 0(int 的默认值(时返回 true,而对于所有其他实例则返回 false。

这是我最初的尝试:

public static bool IsDefaultValue<T>(this T value)
{
    var t = typeof(T); // always comes back as object..?
    if (t.IsValueType && Nullable.GetUnderlyingType(t) == null)
    {
        return value.Equals(Activator.CreateInstance<T>());
    }
    else
    {
        var defaultValue = default(T);
        if (value == null)
            return defaultValue == null;
        else
            return value.Equals(defaultValue);
    }
}

从好的方面来说,我可以附加.IsDefaultValue(( 到任何对象。不幸的是,T 的类型总是以 System.Object 的形式返回。如果我这样设置,我可以得到正确的类型:

var t = typeof(value);

但是,如果该值恰好为空,我会立即收到错误。实现这样的扩展方法有没有很好的解决方法?还是我应该坚持示例中久经考验的路线?

编辑正如评论所指出的,我似乎过于简化了这一点,错过了问题的根源。以下是实际调用我的IsDefaultValue((的内容:

foreach (var imprintProperty in deltas.GetType().GetProperties())
{
    var value = imprintProperty.GetValue(deltas);
    if (!value.IsDefaultValue())
    {
        // get corresponding prop in programmable area
        var programmableProp = progarea.GetType().GetProperty(imprintProperty.Name);
        if (programmableProp != null)
            programmableProp.SetValue(progarea, value);
    }
}

现在很明显.GetValue 始终以 System.Object 的形式返回。唔。

是否仍然可以在扩展方法中将对象视为其基础类型?很抱歉对此感到困惑。

用于检索“默认”值的通用扩展方法

看看这个:

static class Program
{
    static void Main()
    {
        int a = 1;
        Console.WriteLine("a.IsDefaultValue() : " + a.IsDefaultValue());
        a = 0;
        Console.WriteLine("a.IsDefaultValue() : " + a.IsDefaultValue());
        object obj = new object();
        Console.WriteLine("obj.IsDefaultValue() : " + obj.IsDefaultValue());
        obj = null;
        Console.WriteLine("obj.IsDefaultValue() : " + obj.IsDefaultValue());
        int? b = 1;
        Console.WriteLine("b.IsDefaultValue() : " + b.IsDefaultValue());
        b = null;
        Console.WriteLine("b.IsDefaultValue() : " + b.IsDefaultValue());
        Console.ReadKey(true);
    }
    static bool IsDefaultValue<T>(this T value)
    {
        if (ReferenceEquals(value, null))
        {
            return true;
        }
        var t = value.GetType();
        if (t.IsValueType)
        {
            return value.Equals(Activator.CreateInstance(value.GetType()));
        }
        return false;
    }
}

显然有效(我不得不说我确信另一种方式应该有效,但没有(