C#:如何对动态对象执行空检查

Posted

技术标签:

【中文标题】C#:如何对动态对象执行空检查【英文标题】:C#: How to perform a null-check on a dynamic object 【发布时间】:2011-10-25 04:11:13 【问题描述】:

如何对动态对象执行 null-check

伪代码:

public void Main() 
    dynamic dynamicObject = 33;
    if(true)  // Arbitrary logic
        dynamicObject = null;
    
    Method(dynamicObject);


public void Method(dynamic param) 
    // TODO: check if the content of 'param' is equal to null

【问题讨论】:

【参考方案1】:

您是否担心动态对象可能会有一个自定义相等运算符会改变null 的解释方式?如果是这样,请使用Object.ReferenceEquals

if (Object.ReferenceEquals(null, param)) 
  .......

【讨论】:

@Ani 不知道你在那儿得到了什么。 你可以写ReferenceEquals(null, param)。我不敢相信 SO 上关于这个主题的约 5 个问题并没有这么简单地解决它。 @JaredPar:由于所有可以包含方法定义的 C# 类型都扩展了 System.Object (AFAIK),因此没有必要进行限定。 (实际上并不是那么重要。) @JaredPar:很公平。当然,包含类型可以包含一个名为 Object 的成员和一个名为 ReferenceEquals 的实例方法,但行为也不同.. @Ani 绝对是。对我来说,这几乎是邪恶的,几乎每个代码示例都可能被邪恶的人打败。【参考方案2】:

您总是可以只制作类型对象的参数,这就是编译器正在做的事情。当您键入参数动态时,它仅意味着在该方法内它仅对参数的所有使用使用动态调用,但在外部它只是类型对象的签名。你的 dynamicObject 的一个更强大的用法是重载你正在调用的方法,所以如果你保持你的例子相同并且只有两个重载,它会根据运行时类型调用两个方法之一,你总是可以为更多类型添加更多内容。

public void Main() 
    dynamic dynamicObject = 33;
    if(true)  // Arbitrary logic
        dynamicObject = null;
    
    Method(dynamicObject);

public void Method(int param) 
  //don't have to check check null
  //only called if dynamicObject is an int

public void Method(object param) 
// will be called if dynamicObject is not an int or null

【讨论】:

【参考方案3】:

你可以使用简单:

var s = data.servicePhoneNumber is null ? "" : data.servicePhoneNumber.Value;

【讨论】:

【参考方案4】:

快速的方法可能是:

if (_owner is null)



【讨论】:

以上是关于C#:如何对动态对象执行空检查的主要内容,如果未能解决你的问题,请参考以下文章

软件构造课程提纲

如何在c#中检查对象是不是没有空属性[重复]

MediaInfo 在 C# 中动态检查 AudioStreams

C#中Dynamic关键字

如何使用反射动态创建通用 C# 对象? [复制]

C#动态创建接口的实现实例对象