获取类属性的长度

时间:2015-12-10 12:27:10

标签: c# generics system.reflection

我第一次向你介绍我需要做什么,因为我觉得这不是一个正常的"问题,但非常具体。

我有一个班级Words,它定义了16个bool。 这个类在我的通用OldParser类中使用,因为它定义了每个属性。这是我的一个类看起来像单词类型属性。

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

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

所以这是我的问题:我怎样才能获得班级所有属性的列表?然后如何知道数组的大小?

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

我用过:

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

为了获得我的类属性。但我不知道如何获得阵列的大小,而且,我不确定我是否以正确的方式做到了。

3 个答案:

答案 0 :(得分:1)

你可以这样做,

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;
    }
}

答案 1 :(得分:0)

可能是这样的。由于Myclass是您的自定义类型,您将通过GetFields方法获得所有属性。

FieldInfo[] fields = typeof(MyClass).GetFields();
foreach (FieldInfo info in fields) {
  string[] item = (string[])info.GetValue(null);
  Console.WriteLine("Array contains {0} items:", item.Length);     
}

答案 2 :(得分:-1)

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

MyClass instance = ...;

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