【问题标题】:Determine type of object when value is currently null in C#? [duplicate]当 C# 中的值当前为空时确定对象的类型? [复制]
【发布时间】:2013-11-06 09:03:26
【问题描述】:

即使对象的当前值为空,是否有更好的方法来确定对象的底层类型?

当 someObject 确实是字符串类型但当前持有null 值时,以下代码不起作用。

public void doWork(object someObject)
{
    var objAsString = someObject as string;
    if (objAsString != null)
    {
            // do work, return
            // work involves string specific logging/manupulation
    }

    var objAsByteArr = someObject as byte[];
    if (objAsByteArr != null)
    {
            // do work, return 
            // work involves byte specific logging/manupulation
    }

    throw new Exception("Unknown type encountered");
}

【问题讨论】:

  • someObject的类型是什么?是object吗?
  • 你有一个空抽屉。有人递给你一个空盒子,让你把盒子里的所有锤子都放进抽屉里。你这样做,这不会花费很长时间,因为空盒子里没有锤子。之后抽屉还是空的。你现在的问题是:我怎么知道空抽屉是空的,因为它没有锤子? 这是一个疯狂的问题。没有锤子的空抽屉与没有苹果的空抽屉相同。你无法将它们区分开来。
  • 哇...约翰和埃里克在我的第一个 SO 问题上!今天早上我做了正确的事来召唤 C# 众神 :)
  • @user100003:一位C#大神,一位关注的追随者。

标签: c#


【解决方案1】:

没有办法做到这一点:null 对象引用没有与之关联的类型。可以说,这无关紧要:处理恰好是 nullstring 不应不同于处理恰好是 nullbyte[]

// Add this check upfront
if (someObject == null) {
    // do work for null, return
}
// Then continue with your existing code:
var objAsString = someObject as string;
if (objAsString != null)
{
    // do work, return
}

var objAsByteArr = someObject as byte[];
if (objAsByteArr != null)
{
    // do work, return 
}

throw new Exception("Unknown type encountered");

如果你需要知道类型,你应该手动传递类型,或者使用泛型类型参数来静态确定它(即在编译时)。

【讨论】:

  • +1 第一句话。
猜你喜欢
  • 2013-03-04
  • 2011-01-12
  • 1970-01-01
  • 2011-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-19
相关资源
最近更新 更多