深入反射生成数组的详解

 更新时间:2013年06月09日 09:58:38   作者:  
本篇文章是对反射生成数组进行了详细的分析介绍,需要的朋友参考下
今天在论坛有人问怎样反射生成数组,突然又来了兴致,决定试试
其实反射数组最难无非就是数组的初始化和数组的索引了,那么,如何初始化一个数组呢,数组是没有构造函数的,那么用InvokeMember(null, BindingFlags.DeclaredOnly |BindingFlags.Public | BindingFlags.NonPublic |BindingFlags.Instance | BindingFlags.CreateInstance, null, null, new object[] { })
是肯定不行的,用GetMethods来看看,这个类型都有哪些方法。
复制代码 代码如下:

Type t = Type.GetType("System.Int32[]");
foreach(MethodInfo mi in t.GetMethods(BindingFlags.Public | BindingFlags.Instance))
{
    Console.WriteLine(mi.Name);
}

结果如下:

我们看到,有一个名为Set的方法,这个会不会就是呢?
那我们来调用一下看看:
复制代码 代码如下:

Type t = Type.GetType("System.Int32[]");
int[] array = new int[10];//初始化数组长度为10
array = (int[])(t.InvokeMember("Set", BindingFlags.CreateInstance,null, array, new object[] { 5 }));//这里将它的长度变为5看看是否能成功
Console.WriteLine(array.Length);

可以看到,输出结果为5,这证明,的确是用Set方法来初始化数组的。
接下来,我们就会想,如何为数组的元素赋值及如何获取它们的值呢?
再次看一下上面的方法列表,可以看到有GetValue与SetValue方法,那我们来试试:
复制代码 代码如下:

Type t = Type.GetType("System.Int32[]");
object array = new object();
array = t.InvokeMember("Set", BindingFlags.CreateInstance, null, array, new object[] { 10 });
for (int i = 0; i < 10; i++)
     t.GetMethod("SetValue", new Type[2] { typeof(object), typeof(int) }).Invoke(array, new object[] { i, i });
for (int i = 0; i < 10; i++)
     Console.WriteLine(t.GetMethod("GetValue", new Type[] { typeof(int) }).Invoke(array, new object[] { i }));

结果如下:

调用成功,其实还是比较简单的。
可以看到,GetValue与SetValue有多个重载版本,如果想要反射多维数组,就要用到不同的重载,有兴趣的朋友可以自己试试。

相关文章

  • C#中如何执行存储过程方法

    C#中如何执行存储过程方法

    C#中如何执行存储过程方法,需要的朋友可以参考一下
    2013-04-04
  • c#中合并excel表格的方法示例

    c#中合并excel表格的方法示例

    本篇文章主要介绍了c#中合并excel表格的方法,就是将excel表格结构一样的合并到一起,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2016-10-10
  • C#实现表格数据转实体的示例代码

    C#实现表格数据转实体的示例代码

    在实际开发过程中,特别是接口对接之类的,对于这种需求是屡见不鲜,现在很多在线平台也都提供了像json转实体、sql转实体等。本文将用C#实现这一功能,需要的可以参考一下
    2022-09-09
  • C# FileStream简单介绍和使用

    C# FileStream简单介绍和使用

    这篇文章主要为大家详细介绍了C# FileStream基本功能和使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • Unity封装延时调用定时器

    Unity封装延时调用定时器

    这篇文章主要为大家详细介绍了Unity封装延时调用定时器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • 基于XSLT调试的相关问题

    基于XSLT调试的相关问题

    本篇文章是对XSLT调试的相关问题进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C# using语法糖图文详解

    C# using语法糖图文详解

    这篇文章主要给大家介绍了关于C# using语法糖的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 大家应该掌握的多线程编程

    大家应该掌握的多线程编程

    这篇文章主要介绍了大家应该掌握的多线程编程,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • C# Winform调用百度接口实现人脸识别教程(附源码)

    C# Winform调用百度接口实现人脸识别教程(附源码)

    这篇文章主要介绍了C# Winform调用百度接口实现人脸识别教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • C# Stack堆栈的使用方法

    C# Stack堆栈的使用方法

    最近打算学习下C# Stack堆栈的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2009-01-01

最新评论