参照先:Reflection - setting Type of returned obj? いくつかのプロパティを持つオブジェクト・コール・カードがあります。その1つは、独自のプロパティを持つCustomerという別のオブジェクトです。その1つはAdressという別のネストされたオブジェクトです。入れ子オブジェクトのリフレクション取得プロパティ
これらの2つの関数は、他のオブジェクト型も処理します。
private T PopulateObject<T>(T dataObj, System.Data.DataRow dataRow)
{
//Type type = dataObj.GetType();
System.Reflection.PropertyInfo[] proplist = dataObj.GetType().GetProperties();
foreach (System.Reflection.PropertyInfo propertyitem in proplist)
{
if(propertyitem.Name != "")
//s += propertyitem.Name + ":" + (propertyitem.GetValue(dataObj,null)).ToString() + "\r\n";
try
{
propertyitem.SetValue(dataObj, dataRow[propertyitem.Name], null);
}
catch (Exception ex)
{
if (ex.Message.Contains("does not belong to table"))
{
propertyitem.SetValue(dataObj, PopulateChildObject(propertyitem, dataRow), null);
}
else
throw;
}
}
return dataObj;
}
private object PopulateChildObject(object dataObj, System.Data.DataRow dataRow)
{
System.Reflection.PropertyInfo[] proplist = dataObj.GetType().GetProperties();
foreach (System.Reflection.PropertyInfo propertyitem in proplist)
{
if(propertyitem.Name != "")
try
{
propertyitem.SetValue(dataObj, dataRow[propertyitem.Name], null);
}
catch (Exception ex)
{
if (ex.Message.Contains("does not belong to table"))
{
propertyitem.SetValue(dataObj, PopulateChildObject(propertyitem, dataRow), null);
}
else
throw;
}
}
return dataObj;
}
問題はPropertyInfoリストが渡されchildObjのものではありませんので、PopulateChildObject機能が動作しないということです。 Watch内のPopulateChildObjectに渡されたdataObjを見ると、属性は0です。また、PopChildObj()に渡されるdataObjには、Customer型の代わりにSystem.Reflection.RuntimePropertyInfoの型があります。私は何が欠けていますか?
(コメントに返信) –