如何使用反射镜获取阵列的长度
本文关键字:阵列 获取 何使用 反射镜 | 更新日期: 2023-09-27 17:57:46
我有库和控制台程序,它们动态地获取这是库。类上的库中存在int数组。那么,我可以在程序中,用反射镜得到这个阵列吗?这是图书馆的代码:
public class Class1
{
public int [] arrayInt;
public Class1()
{
arrayInt = new int[5] {1,2,3,4,5};
}
}
这是程序代码:
Assembly asm = Assembly.LoadFile(@"C:'TestLibrary.dll");
Type Class1 = asm.GetType("TestLibrary.Class1") as Type;
var testClass = Activator.CreateInstance(Class1);
PropertyInfo List = Class1.GetProperty("arrayInt");
int[] arrayTest = (int[])List.GetValue(testClass, null);//throw exception here
Console.WriteLine("Length of array: "+arrayTest.Count);
Console.WriteLine("First element: "+arrayTest[0]);
您会得到异常,因为public int[] arrayInt;
不是属性,而是成员变量,因此Class1.GetProperty(...)
返回null
。
备选方案1)使用GetMember
而不是GetProperty
MemberInfo List = Class1.GetMember("arrayInt");
备选方案2)在Class1
中声明属性
public int[] ArrayInt
{
get { return arrayInt; }
}
并将反射代码更改为:
PropertyInfo List = Class1.GetProperty("ArrayInt");
此外,请注意,您的代码甚至不应该编译,因为数组没有Count
属性,而只有Length
属性。下面的行应该给出一个编译错误:
Console.WriteLine("Length of array: "+arrayTest.Count);
并且应该读取
Console.WriteLine("Length of array: "+arrayTest.Length);
使用
Class1.GetMember("arrayInt");
的安装
Class1.GetProperty("arrayInt");
您在原始类中创建了一个字段,但将其反映为属性!
public class Class1
{
public int [] arrayInt {get;set;} // <-- now this is a property
public Class1()
{
arrayInt = new int[5] {1,2,3,4,5};
}
}
仅在arrayTest.Count
:之后添加()
Assembly asm = Assembly.LoadFile(@"C:'TestLibrary.dll");
Type Class1 = asm.GetType("TestLibrary.Class1") as Type;
var testClass = Activator.CreateInstance(Class1);
PropertyInfo List = Class1.GetProperty("arrayInt"); // <!-- here you are looking for a property!
int[] arrayTest = (int[])List.GetValue(testClass, null);//throw exception here
Console.WriteLine("Length of array: "+arrayTest.Count());
Console.WriteLine("First element: "+arrayTest[0]);