C# 如何使用反射调用字段初始值设定项?

标签 c# reflection field invoke initializer

假设我有这个 C# 类

public class MyClass {
    int a;
    int[] b = new int[6];
}

现在假设我使用反射发现了这个类,并且在查看字段时我发现其中一个是数组类型(即:b)

foreach( FieldInfo fieldinfo in classType.GetFields() )
{
    if( fieldInfo.FieldType.IsArray )
    {
        int arraySize = ?;
        ...
    }
}

我知道不能保证数组有一个创建数组的字段初始值设定项,但如果有,我想知道由字段初始值设定项创建的数组的大小。

有没有办法调用字段初始化器?

如果有我会这样做:

Array initValue = call field initializer() as Array;
int arraySize = initValue.Length;

我唯一发现的是创建整个类的一个实例,但我不想这样做,因为它太过分了......

最佳答案

嗯,你不能。

以下代码:

public class Test
{
    public int[] test = new int[5];

    public Test()
    {
        Console.Read();
    }
}

将被编译为:

public class Program
{
    public int[] test;

    public Program()
    {
        // Fields initializers are inserted at the beginning
        // of the class constructor
        this.test = new int[5];

        // Calling base constructor
        base.ctor();

        // Executing derived class constructor instructions
        Console.Read();
    }
}

因此,在创建该类型的实例之前,无法知道数组大小。

关于C# 如何使用反射调用字段初始值设定项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14732926/

相关文章:

C# SqlConnection 无法连接

c# - 在 ViewModel 之间共享集合

java - 如何使用用户给出的参数调用静态方法(反射)

java - 使用数组调用带可变参数的构造函数

c# - Silverlight Combobox 失去了视觉值(value),但当它所在的页面被隐藏并重新显示时,它会保留选定的值(value)

c# - 排序字典时出错

c# - 反射字符串时抛出的参数计数不匹配

mysql:使用一个字段包含多个 "fields"来保存字段

java - 如何访问我只通过字符串名称知道的类的类字段?

c# - Sharepoint Guidfield - 如何在前端显示它并在代码中设置它的值?