0

我正在从我的类中动态创建数据表。基本上,我使用 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;
            }
        }
4

1 回答 1

1

据我了解,您想找出给定可空类型的不可空等价物(例如,“int”中的“int”)。后者实际上是

Nullable<int>

所以你需要一个通用的参数。尝试这个:

typeof(int?).GetGenericArguments()
于 2013-10-11T15:46:51.053 回答