私は自分のクラスからデータテーブルを動的に作成することに取り組んでいます。基本的には、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;
}
}