将FieldInfo值转换为未知的列表时列表类型



我有以下内容:

[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,并将该对象的类型作为另一个参数:module.GetType()

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

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

函数中的参数名称为StructStructType

我循环浏览Struct中的字段名称,提取不同字段的值和,并对其进行处理

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

函数仅通过StructType知道Struct的类型。在VB中,代码很简单:

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

然后:

fieldValue(0)

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

那么,我的问题是,该函数只知道StructStructType的类型,如果可能的话,我如何在C#中复制VB行为?

以下是一些(非常简单)的示例代码,非常详细。。。我真的不想为你做整件事,因为这可能是一堂反思的好课:)

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

相关内容

  • 没有找到相关文章

最新更新