Я заселять различные типы объектов с DataRows с каждым attrivute соответствующего объекта = в поле имени вывести так в DataRow.Reflection - setting Тип возвращаемого объекта?
Я хотел бы использовать обобщенную функцию, чтобы сделать это. Как заставить тип возвращаемого объекта из общей функции. Я еще не знаю, что синтаксис <T>
на самом деле означает: PopulateObject<T>
не возвращает типа, как я получаю ошибку компилятора - не может неявно преобразовать тип «объекта» в «JobCard» Смотрите мой код ниже
public JobCard AcceptJobCard(Guid jobCardGuid, Guid userGuid)
{
try
{
JobCard jc= new JobCard();
DL_ISMS.DataSets.JobCardDS.View_JobcardDataTable dtJC = BL_ISMS.Meter.JobCard_CB.FetchJobCard(jobCardGuid);
DL_ISMS.DataSets.JobCardDS.View_JobcardRow jcRow = dtJC[0];
DateTime dateAccept = DateTime.Now;
bool res = BL_ISMS.Meter.JobCard_CB.UpdatePdaJobCard(userGuid, jobCardGuid, null, null, null, JobCardStatus.Accepted.GetHashCode(), null, null, null, null, "", "", "", "", "", "", null, dateAccept, null, null, null, null, null, null);
if (res)
{
jc = PopulateObject<JobCard>(jc, jcRow);
return jc;
}
else
return jc;
}
catch (Exception ex)
{
Trace.WriteException(ex);
throw;
}
}
private object PopulateObject<T>(object dataObj, System.Data.DataRow dataRow)
{
Type type = dataObj.GetType();
System.Reflection.PropertyInfo[] proplist = type.GetProperties();
string s = "";
foreach (System.Reflection.PropertyInfo propertyitem in proplist)
{
s += propertyitem.Name + ":" + (propertyitem.GetValue(dataObj,null)).ToString() + "\r\n";
propertyitem.SetValue(dataObj, dataRow["propertyitem.Name"], null);
}
return (T)dataObj;
}
- --- обновляется после 2-го ответа ----
используя этот код: частный T PopulateObject (T 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, PopulateObject<propertyitem.GetType()>(propertyitem, dataRow), null);
}
else
throw;
}
}
return dataObj;
}
Я ударил еще один блокпост. Одним из атрибутов является фактически другой объект Customer, имеющий 11 атрибутов его собственных. Я подозреваю, что еще больше вложенных объектов все еще скрываются. Как бы я справился с заполнением этих вложенных объектов, для которых есть только 1 поле в datarow ?.
Чтобы справиться с этими объектами: - я должен был бы извлечь тип ChildObj в родительском Objdata - вызвать функцию ProcessChildObj(), к которому я прохожу ChildObjType и полный DataRow - и в ProcessChildObj() выполнить совпадение имен и установить этот атрибут?
или (как в приведенном выше коде) - Вызов PopulateObject рекурсивно. Это, однако, представляет проблему с компилятором, когда я пытаюсь передать тип obj в рекурсивный вызов:
propertyitem.SetValue (dataObj, PopulateObject (propertyitem, dataRow), null); // вызывает компилятор msg «Оператор <» не может применяться к операндам типа «группа методов» и «System.type»
Как извлечь тип вложенного childObj для передачи типа в качестве параметра?
вы правы, я заметил, что когда я запускал код. Сейчас работает. – callisto