2009-05-25 3 views
1

Я заселять различные типы объектов с 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 для передачи типа в качестве параметра?

ответ

1

Изменить подпись вашего метода, чтобы:

private T PopulateObject<T>(T dataObj, System.Data.DataRow dataRow) 

Кроме того, я думаю, что вам не нужно, чтобы вернуть любой объект, потому что ваш только обновление существующего объекта. Вы можете просто использовать:

private void PopulateObject(object dataObj, System.Data.DataRow dataRow) 
0

Re вернуть его ... почему возвращение это? Вы уже обновили его ... вызывающий получит изменения. И если вы не используете generics в методе (вы не используете), просто используйте object и никаких дженериков.

Если сам код не работает, я думаю, самая большая проблема с использованием строки «propertyitem.Name», а не оценки стоимости недвижимости: propertyitem.Name:

propertyitem.SetValue(dataObj, dataRow[propertyitem.Name], null); // no quotes 

Вы можете захотеть посмотрите на this post тоже.

+0

вы правы, я заметил, что когда я запускал код. Сейчас работает. – callisto

 Смежные вопросы

  • Нет связанных вопросов^_^