我第一次向你介绍我需要做什么,因为我觉得这不是一个正常的"问题,但非常具体。
我有一个班级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();
为了获得我的类属性。但我不知道如何获得阵列的大小,而且,我不确定我是否以正确的方式做到了。
答案 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);