如何检查动态对象是否为空

10

我最近看到了下面的代码,让我很困惑。

dynamic resultObj = SomeClass.run(arg);
if (resultObj == null || resultObj.ToString() == null)
{
    /* Error handling */
}

假设 SomeClass 是您典型的类(未覆盖 ToString()),第二部分条件语句有必要吗?此代码还存在其他潜在问题吗?

run 函数返回什么?如果它可能返回一个覆盖了 ToString 并且有可能返回 null 的类,那么是的,在 if 块中使用 ToString 的结果时需要进行第二次检查。所有的 dynamic 意思就是“在运行时我不知道类型”。 - D Stanley
1
如果它没有覆盖 ToString,那么它就会调用 object.ToString(),该方法返回 对象类型的完全限定名 - 因此,是的 - 不需要进行 .ToString() == null 检查。 - Rob
看起来设计不太好,允许随机类实例化具有随机返回值。 - Greg
1个回答

12

动态变量可以直接检查是否为 null,但某些情况可能会产生错误的答案。为了检查动态变量是否为 null,您应该将其转换为对象。例如:

dynamic post = SomeMethod();
if (post.modified == null){
//could return errors.
}

为了检查这个属性是否为null,你应该像这样做:

string.IsNullOrEmpty(Convert.ToString(post.Modified));

同样地,要检查动态变量是否为null,您应该这样做:

if ((object)post != null)

参考文献:

https://ericlippert.com/2018/11/19/a-dynamic-definite-assignment-puzzle-part-2/

https://forums.asp.net/t/1592751.aspx?How+to+check+for+null+empty+strings+on+dynamic+objects+

因此,通过检查resultObj.ToString() == null,我认为这可能会将dynamic转换为对象,从而使真正的null检查成为可能。

自定义运算符可能导致对动态对象进行空值检查时返回与预期不同的逻辑。您可以通过将其转换为对象来解决此问题,我相信,如果我错了,请随意给我投反对票并提供原因。 https://dev59.com/Fmw05IYBdhLWcg3wykzn. - Patrick Knott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接