今天在论坛有人问怎样反射生成数组,突然又来了兴致,决定试试
其实反射数组最难无非就是数组的初始化和数组的索引了,那么,如何初始化一个数组呢,数组是没有构造函数的,那么用
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# 中Session的用法
这篇文章主要介绍了C# 中Session的用法,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
2020-07-07
-
-
-
C#使用BackgroundWorker控件
这篇文章介绍了C#使用BackgroundWorker控件的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2022-02-02
-
-
c#学习之30分钟学会XAML
一个界面程序的核心,无疑就是界面和后台代码,而xaml就是微软为构建应用程序界面而创建的一种描述性语言,也就是说,这东西是搞界面的
2016-11-11
-
c# in depth的泛型实现实例代码
这篇文章主要介绍了c# in depth的泛型实现实例代码,学C#的同学一定会用到泛型实现的,这里我们提供了泛型实现的程序代码,大家参考使用
2013-11-11
-
轻松学习C#的装箱与拆箱
轻松学习C#的装箱与拆箱,在之前的文章简单的提到了轻松学习C#的装箱与拆箱,本文带着大家更加详细的介绍轻松学习C#的装箱与拆箱,感兴趣的小伙伴们可以参考一下
2015-11-11
-
Unity游戏开发中的设计模式之策略模式
策略模式是Unity游戏开发中常用的设计模式之一,用于封装一系列算法或行为,并使这些算法或行为可以相互替换。通过策略模式,可以在运行时动态地选择算法或行为,实现游戏中的多样性和可扩展性。常见的应用包括AI行为、武器攻击、移动方式等
2023-05-05
-
C#之如何实现真正的四舍五入
这篇文章主要介绍了C#之如何实现真正的四舍五入问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-05-05