根据此处的示例,我正在尝试确定对象的默认值:
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 返回。呃。
是否仍然可以在扩展方法中将对象视为其底层类型?很抱歉与此混淆。