更新:此问题包含此问题下提供的功能的实现。最快的 V7 实施
您需要编写一个函数,该函数接受一个对象并返回该对象是否具有默认值。
public bool IsDefault(object o)
{
return ...
}
现在我唯一想到的就是找出类型的名称,并通过switch检查对象是否具有该类型的默认值。它看起来像这样:
string typeName = o.GetType().Name;
switch (typeName)
{
case "Int32":
if(Convert.ToInt32(o) == 0)
{
return true;
}
return false;
case "String":
if (o == null || String.IsNullOrEmpty(Convert.ToString(o)))
{
return true;
}
return false;
...
...
...
}
我认为最好的选择是:
事实证明,如果对象中有演员表,则该对象有点“扭曲”。在这种情况下,有关模板的信息可能会丢失(Nullable 的一个有争议的问题)。对于“简单”类型,我在第二个条件中考虑了这一点。
但最“正确”的是
同时,
isDefault((object)0)此选项将给出false,因为defalut(object) != 0开发人员可能不喜欢,这种情况只有在使用模板时才有用。根据您是使用模板类型还是将所有内容转换为对象,一种或另一种方式适合您。如果您希望 IsDefault((int?)0) 为真,则必须简化一点(删除 IsGenericType)。default(T)==null 的情况发生了,但是同时发生的可能性很小default(T)!=null,所以可以改写o == nulldefault(T)!=nulltrue剩下的留给历史吧……
通过反射(这里有一个 Cast in object 所以有些值会丢失,例如它
IsDefault((int?)0)会给出 true为此,您需要连接两个像这样的问题 https://stackoverflow.com/questions/1895761/test-for-equality-to-the-default-value与这个https://stackoverflow.com/questions 连接 /6204326/调用-generic-method-using-reflection-in-net
如果您事先知道类型,那么您可以像这样简单地使用泛型而不使用反射
信息也在这里丢失 - 它
IsDefault((int?)0)会给出真实的,所以,这样就更好了(原来你不需要指定类型,而且对象没有转换成对象,类型可能会因为转换而丢失)
好吧,如果你有两种或三种类型,你可以这样做(没有泛型,只是类型比较):
另一个不寻常的“短”选项(它也适用于带有数字和字符串的类,虽然这个选项更耗费资源,但在一行中)
但是这种方法在没有默认值的情况下会创建一个空实例,所以在某些情况下是合适的。
PS 1. 对于默认类,该值通常为 null(在工作室中它不为 null 的情况 - 我没有找到),包括泛型。对于 valuetype 和 struct 有默认值。
我们无权“丢失”对象的真实类型,否则无法
int?区分int。所以你必须做这样的事情:考试:
在 object上,
(object)(int?)0该方法将返回true,因为传递的对象是装箱的int,而不是装箱int?的(本质上不会发生)。可以像这样获得类型的默认值:
用法:
最近c#语言更新到了7.1版本,现在可以这样写了:
UPD 将不起作用,因为
otypeobject,但是default(object) == null在我看来最快的另一种选择。让我们使用这里的技巧: