`

C# 如何判断一个引用是数组类型?

    博客分类:
  • C#
阅读更多
问答原文:
string[] a;
int[] b;

// 这样可以判断,但是不是我想要的写法,因为is判断不仅限于类型相等,前者是后者的子类也返回true
// 虽然Array不会有子类,但是我希望写法和其他代码统一风格
if (a is Array){ ....  // true
if (b is Array){ ....  // true


// 我想要类似这样的写法
if (a.GetType() == typeof(Array)){ ....  // false
// 但==左边是String[],右边是System.Array,等式不成立

// 我又不能写成
if (a.GetType() == typeof(string[])){ ...  // true
// 因为不仅仅是string数组,int数组,其他数组都希望被检查出来
// 用object[]也不行
if (a.GetType() == typeof(object[])){ ...  // false


我的解答:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;

namespace TypeCheck
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] b = new string[] {"1", "2", "3"};
            Console.WriteLine(typeof(string[]));
            Console.WriteLine("The type is {0}", b.GetType());
            if (b.GetType().IsArray)
                Console.WriteLine("Its true");
            else
                Console.WriteLine("ITs false");
            if (b.GetType() == typeof(string[]))
            {
                Console.WriteLine("true");
            }
            else
            {
                Console.WriteLine("false");
            }
            Console.Read();
        }
    }
}


RednaxelaFX的答案:
using System;

static class Demo {
    static bool IsArray(this object o) {
        return o is Array;
    }
    
    static bool IsArray2(this object o) {
        if (null == o) return false;
        return o.GetType().BaseType == typeof(Array);
    }
    
    static void Main(string[] args) {
        Console.WriteLine("args is array: {0}", args.IsArray());
        Console.WriteLine("args is array: {0}", args.IsArray2());
    }
}



分享到:
评论

相关推荐

    c#调用Oracle UDT自定义结构数组类型源代码

    首先,我们需要在Oracle数据库中定义UDT,例如一个包含多个元素的数组类型。这可以通过PL/SQL语句完成,如: ```sql CREATE OR REPLACE TYPE my_array_type AS TABLE OF VARCHAR2(100); ``` 然后,在C#项目中,...

    C#调用C++ Dll关于结构体数组引用的传递及解析使用的展示代码

    此外,还定义了一个名为`GetDeviceIdList`的函数,它接收一个`DEVICE_INFO`结构体数组的指针以及一个整型引用`count`作为参数。 #### C#中的结构体定义 接下来,在C#中定义相应的结构体以匹配C++中的定义: ```...

    2.1.1 C++和C#数据传递 -常用类型数组和List类型传递

    转向C#,C#中的数据传递始终是通过引用进行的,即使对于基本类型,也会创建一个装箱对象。数组在C#中也是对象,所以传递数组参数实际上是在传递数组的引用。这与C++的行为相似,但在C#中,这种行为是默认的,无需...

    C#实现对二维数组排序的方法

    例如,`T[,] array`定义了一个类型为`T`的二维数组。 要对二维数组进行排序,我们不能直接使用C#内置的排序方法,如`Array.Sort()`,因为它们通常适用于一维数组。对于二维数组,我们需要自定义排序逻辑。文中提供...

    C#中动态声明与使用对象数组实例

    在C#中,动态声明一个对象数组通常涉及使用new运算符和System.Collections.ArrayList类,或者使用泛型的List类。以下是一个使用ArrayList的例子: ```csharp ArrayList array = new ArrayList(); array.Add(new ...

    C#基础知识 C#数组

    首先,我们来看一下C#中的数组类型。在C#中,数组分为一维数组、二维数组以及多维数组。一维数组是最简单的形式,类似于线性的数据结构,可以理解为一个有固定长度的序列。例如,`int[] numbers = new int[5];` 创建...

    C#数据类型,数组、结构和枚举是学习C#的基础!

    System.Collections.ArrayList 是 C# 中的一个集合类,它可以存储不同类型的元素。 C# 数组在内存中的结构是连续的,数组的每个元素占用固定大小的内存空间。数组的元素可以通过下标访问,下标从 0 开始。 C# 支持...

    C#将字符串数组传递给C++ DLL.rar

    C#中的字符串是引用类型,由.NET框架管理,而C++中的字符串可以是字符数组(char*)或宽字符数组(wchar_t*)。因此,传递字符串数组时,需要进行适当的类型转换。 1. **定义C++ DLL接口**: 在C++ DLL中,我们...

    C#中各种数组的性能比较

    在C#编程语言中,数组是存储相同类型数据的基本结构之一,它们被广泛应用于各种场景。根据不同的需求,C#提供了多种类型的数组,包括一维数组、交错数组...开发者应根据实际情况权衡各种因素,选择最适合的数组类型。

    C#基础知识 c#编程规范 数组

    总的来说,掌握C#的基础知识和编程规范,特别是数组的使用,对于成为一个合格的C#开发者至关重要。理解类和接口、虚方法和抽象方法、值类型和引用类型之间的关系,以及如何利用各种集合类和正则表达式解决问题,将使...

    c#调用c++DLL,dll有二维数组

    本篇将详细讲解如何在C#中调用一个包含二维数组的C++DLL。 首先,我们需要了解C#与C++之间的互操作性依赖于.NET框架提供的`Platform Invoke (P/Invoke)`机制。P/Invoke允许C#代码直接调用非托管(如C++)代码,并...

    C#byte数组结构体互相转换示例.zip

    3. **字节数组转结构体**:创建一个方法将字节数组还原为结构体。 ```csharp public static MyStruct ByteArrayToStruct(byte[] byteArray) { GCHandle handle = GCHandle.Alloc(byteArray, GCHandleType.Pinned); ...

    C#中引用类型和值类型的区别

    这意味着,当我们传递一个引用类型的参数到方法中,或者将其赋值给另一个变量时,传递或复制的是对象的引用,而非对象本身。这种机制下,修改通过引用传递的对象会影响到原始对象的状态,因此在处理大对象或需要避免...

    C#引用类型的赋值 类的赋值

    这意味着当你创建一个引用类型的实例时,它会分配在堆内存中,并且变量只包含一个指向这个堆内存地址的引用。 #### 二、引用类型赋值过程解析 当我们对引用类型的变量进行赋值操作时,实际上是将源变量所指向的...

    C#中数组做参数的小例子

    在某些性能敏感的场景下,C#提供了一种称为固定大小的缓冲区的特殊数组类型,它能提供更高效的访问方式。例如: ```csharp unsafe { fixed (int* buffer = &numbers[0]) { // 使用指针访问缓冲区 } } ``` ...

    c#题库判断题(很齐全)

    * 值类型的变量赋值会创建所赋的值的一个副本,而用类型的变量赋值复制的是引用而不是由引用标识的对象。 * 任何类型都不可能从值类型派生,因此,所有值类型都是隐式密封的。 通过本资源摘要信息,读者可以对C#...

    C#数组的详细的讲解

    C#中的数组是一种存储同一类型数据的集合,它提供了一种高效且有序的方式来管理大量数据。数组分为一维数组、二维数组甚至多维数组,它们是C#编程基础中的重要组成部分。 一维数组是最简单的形式,它就像一条线性的...

    C#调用C++的dll实例,回调函数,string和int数组参数传递

    这里的`CallbackFunc`是函数指针类型,它接受一个字符串和一个整型数组作为参数。 2. **C#中的委托类型**:在C#中,我们需要创建一个与C++回调函数匹配的委托类型。 ```csharp public delegate void ...

    C#基础知识 值类型、引用类型

    引用类型(Reference Types)包括类(class)、接口(interface)、数组和委托(delegate)。引用类型在内存中存储的是对象的引用,而不是实际的数据。当变量赋值或传递给函数时,传递的是对同一块内存区域的引用,...

Global site tag (gtag.js) - Google Analytics