获取 class 个属性长度

Getting class attributes length

第一次我会向你介绍我需要做什么,因为我认为这不是一个"normal"问题,而是一个非常具体的问题。

我有一个 class Words,它定义了 16 个布尔值。 这个 class 在我的通用 OldParser class 中使用,因为它定义了每个属性。这是我的 class 带有 Words 类型属性的样子。

class MyClass: OldParser 
{
    public Words[] arg1 = new Words[2]; 
    public Words[] arg2 = new Words[5];
    public Words arg3;
}

然后我有一个单词数组,其中包含创建 class 所需的内容。 所以前两个单词将转到 arg1。其他 5 个分配给 arg2,最后一个分配给 arg3。 当然,我需要它对我拥有的每个 class 都是通用的,所以它需要是通用的。

所以这是我的问题:我怎样才能得到我的 class 的所有属性的列表?然后怎么知道数组的大小?

例如,对于这个 class,我需要获取每个属性并知道我的第一个属性是 2 的数组,第二个是 5 的数组,最后一个属性不是数组.

我用过:

List<System.Reflection.FieldInfo> list = typeof(MyClass)
            .GetFields(BindingFlags.Instance|BindingFlags.NonPublic|BindingFlags.Public)
            .ToList();

为了得到我的class属性。但我不知道如何获取数组的大小,而且我不确定我的做法是否正确。

由于字段是非静态的,因此您无法在没有实例的情况下访问数组长度。创建实例后,您可以执行以下操作:

MyClass instance = ...;

IDictionary<FieldInfo, int> arrayLengths = list.Where(field => field.FieldType.IsArray)
    .ToDictionary(field => field, 
                  field => ((Array)field.GetValue(instance)).Length);

你可以这样做,

var myClass = new MyClass();
var fieldInfos = typeof(MyClass).GetFields();

var myArraysAndLengths = new Dictionary<string, int>();
foreach (var field in fieldInfos)
{
    var fieldName = field.Name;
    var fieldValue = field.GetValue(myClass);
    var fieldType = field.FieldType;
    if (fieldType == typeof (Words[]))
    {
        var value = (Words[]) fieldValue;
        var length = value.Length;
        myArraysAndLengths[fieldName] = length;
    }
}