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