将ListInfo值转换为List当List类型未知时

时间:2012-11-22 21:00:05

标签: c# list reflection system.reflection

我有以下内容:

    [Serializable()]
    public struct ModuleStruct {
        public string moduleId;
        public bool isActive;
        public bool hasFrenchVersion;
        public string titleEn;
        public string titleFr;
        public string descriptionEn;
        public string descriptionFr;
        public bool isLoaded;
        public List<SectionStruct> sections;
        public List<QuestionStruct> questions;
    }

我创建了一个这样的实例并填充它(与问题无关的内容)。我有一个函数,它将实例化对象作为一个参数,让我们调用它模块,并将该对象的类型作为另一个参数:module.GetType()

然后,此函数将使用反射和:

    FieldInfo[] fields = StructType.GetFields();
    string fieldName = string.Empty;

函数中的参数名称为StructStructType

我遍历Struct中的字段名称,拉取值和不同字段并对其执行操作。一切顺利,直到我到达:

    public List<SectionStruct> sections;
    public List<QuestionStruct> questions;

该函数仅通过Struct知道StructType的类型。在VB中,代码只是:

    Dim fieldValue = Nothing
    fieldValue = fields(8).GetValue(Struct)

然后:

    fieldValue(0)

获取列表部分中的第一个元素;但是,在C#中,相同的代码不起作用,因为fieldValue是一个对象而我无法对一个对象执行fieldValue[0]

我的问题是,函数只知道Struct StructType的类型,如果有可能,我如何在C#中复制VB行为?

1 个答案:

答案 0 :(得分:2)

这里有一些(非常简单的)示例代码,几乎已经说明了......我真的不想为你做整件事,因为这可能是反思的一个很好的教训:)

private void DoSomethingWithFields<T>(T obj)
{
    // Go through all fields of the type.
    foreach (var field in typeof(T).GetFields())
    {
        var fieldValue = field.GetValue(obj);

        // You would probably need to do a null check
        // somewhere to avoid a NullReferenceException.

        // Check if this is a list/array
        if (typeof(IList).IsAssignableFrom(field.FieldType))
        {
            // By now, we know that this is assignable from IList, so we can safely cast it.
            foreach (var item in fieldValue as IList)
            {
                // Do you want to know the item type?
                var itemType = item.GetType();

                // Do what you want with the items.
            }
        }
        else
        {
            // This is not a list, do something with value
        }
    }
}