Я заполняю объекты разных типов даторами с каждым отношением соответствующего объекта = к аналогичному полю имени в датарове.
Я бы хотел использовать универсальную функцию для этого. Как заставить тип возвращаемого объекта из обобщенной функции. Я еще не знаю, что на самом деле означает синтаксис <T>
:
PopulateObject<T>
не возвращает тип, так как я получаю сообщение об ошибке компилятора - не удается неявно преобразовать тип 'object' в '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-го ответа ----
используя этот код:
private 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 поле?.
Для обработки этих объектов:
- Я должен был бы извлечь тип ChildObj в родительской Objdata
- вызвать функцию ProcessChildObj (), которой я передаю ChildObjType, и полный набор данных
- а в ProcessChildObj () сопоставить имя и установить этот атрибут?
или (как в коде выше)
- Вызовите объект PopulateObject рекурсивно. Это, однако, создает мне проблему, поскольку компилятор жалуется, когда я пытаюсь передать тип obj в рекурсивный вызов:
propertyitem.SetValue (dataObj, PopulateObject (propertyitem, dataRow), null); // вызывает компилятор msg «Оператор« <»не может быть применен к операндам типа« группа методов »и« System.type »» </p>
Как извлечь тип вложенного childObj для передачи типа в качестве параметра?