【问题标题】:How to do typeof object[*] in C#?如何在 C# 中执行 typeof object[*]?
【发布时间】:2012-03-25 02:34:25
【问题描述】:

我对 C# 还很陌生,但是已经在网上搜索了一个小时,但没有任何乐趣......

我需要确定一个对象是否为非零索引数组,即object[*]

我试过了:

if(v != null && v.GetType() == typeof(object[*]))

和 if(v 是对象[*])

以及重载方法Method(object v)和Method(object[*] v)

都会导致编译错误。

因为我不能将 object[*] 转换为 object[] 然后测试 GetLowerBound(0) 我怎么能测试这种类型?

(请不要告诉我这个糟糕的代码/设计,它来自 Excel,所以我显然无法更改)。

【问题讨论】:

  • 你从哪里得到[*] 语法?我从没见过。
  • 表示基于非零的索引数组,即不从[0]开始的数组。在 Excel 代码中大量使用(它们从 1 开始)。
  • “非零索引数组”是什么意思?
  • @AndreiG 一个数组,其下界不是零。

标签: c# arrays


【解决方案1】:

我想你想要:

Array array = v as Array;
if(array != null && array.GetLowerBound(0) != 0)
{
    ...
}

测试:

var array = Array.CreateInstance(typeof(object), new[] { 3 }, new[] { 1 });
Console.WriteLine(array.GetType());
Console.WriteLine(array.GetLowerBound(0));

输出:

System.Object[*]
1

【讨论】:

  • +1 获得正确的代码答案,@Andre Loker 第一次到达那里,所以接受了他的答案,但非常感谢
【解决方案2】:

如有必要,请尝试 Type.IsArrayType.GetArrayRankType.GetElementType

如果您需要调用GetLowerBound,您可以安全地将对象转换为System.Array

【讨论】:

    【解决方案3】:

    如果对象的类型确实是 object[] 而不是 string[] 或其他数组,那么就可以了

    typeof(object[])
    

    数组大小的占位符不是必需的,因为这是声明数组的正常方式

    object[] myObjectArray;
    

    编辑:

    在您的情况下,您可以将语句简化为

    if(v is object[])
    

    因为

    ((object[])null) is object[]
    

    收益false

    【讨论】:

    • 不是,因为您不能将 object[] 转换为 object[]。 [] 不是占位符
    • 星号* 是占位符。我的意思是,写object[],而不是object[*]
    • No StackOverflow 采用两个星号并将中间位格式化为斜体。在这种情况下,Asterisk 不是占位符,objeft[ASTERISK] 是一个基于非零的索引数组,即不从零开始。
    • 好的,我明白了。在 C# 中声明的数组始终具有从零开始的索引。非从零开始的索引仅适用于 COM-API(例如 Excel)返回的数组。
    • 顺便说一句。您可以使用重音符号(一种反斜杠撇号)转义代码部分。我的 US-ASCII 键盘上 ESC 键下方的键。 --> `
    【解决方案4】:
     Object [] v = new Object[2];
    
     if (!ReferenceEquals(v, null))
              {
                  if ((v.GetType() is System.Object)
                      && (v.GetType().IsArray))
                  {
    
                  }
              }
    

    但只是 'v' 是初始化而不是你里面的对象!!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-17
      • 2012-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多