如何使用反射镜获取阵列的长度

本文关键字:阵列 获取 何使用 反射镜 | 更新日期: 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]);