我正在从我的类中动态创建数据表。基本上,我使用 FieldInfo 和 Type,以及 GetFields 来动态创建数据表。问题是我的课程使用数据表无法处理的 System.Nullable。我正在尝试获取基本类型,然后将列设置为 Nullable = true
编辑:老实说,我还没有尝试过很多事情。目前我对类型不是很好。我的主要目标是我想获取我扔给我的方法的任何对象的属性类型,并创建一个列名称与我的属性相同类型的数据表。所以我的代码失败的地方是当它到达 myFieldInfo[i].FieldType 时。这实际上似乎并没有返回类型,而是返回一个描述类型的字符串。我可以通过分析字符串来手动创建类型,但我觉得这对于我需要做的事情来说太过分了。
编辑:所以忽略我包含的代码。我的目标:我想将一个对象传递给我的方法,让它动态获取属性,然后创建一个数据表,其中列的名称与属性相同并且具有相同的类型(或与数据表等效的任何类型)。它不一定需要使用 FieldInfo,这只是我的起点。
这是我的基本代码的副本。
DataTable peopleTable = new DataTable();
pPeople myPerson = new pPeople();
FieldInfo[] myFieldInfo;
Type myType = typeof(pPeople);
myFieldInfo = myType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
for (int i = 0; i < myFieldInfo.Length; i++)
{
peopleTable.Columns.Add(myFieldInfo[i].Name, myFieldInfo[i].FieldType);
peopleTable.Columns[i].AllowDBNull = true;
}
编辑:这是我创建数据表的最终代码。感谢大家的帮助;
DataTable peopleTable = new DataTable();
pPeople myPerson = new pPeople();
FieldInfo[] myFieldInfo;
Type myType = typeof(pPeople);
myFieldInfo = myType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
for (int i = 0; i < myFieldInfo.Length; i++)
{
if (Nullable.GetUnderlyingType(myFieldInfo[i].FieldType) == null)
{
peopleTable.Columns.Add(myFieldInfo[i].Name, myFieldInfo[i].FieldType);
}
else
{
peopleTable.Columns.Add(myFieldInfo[i].Name, Nullable.GetUnderlyingType(myFieldInfo[i].FieldType));
peopleTable.Columns[i].AllowDBNull = true;
}
}