Reflection - настройка Тип возвращаемого объекта? - PullRequest
1 голос
/ 25 мая 2009

Я заполняю объекты разных типов даторами с каждым отношением соответствующего объекта = к аналогичному полю имени в датарове.

Я бы хотел использовать универсальную функцию для этого. Как заставить тип возвращаемого объекта из обобщенной функции. Я еще не знаю, что на самом деле означает синтаксис <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 для передачи типа в качестве параметра?

Ответы [ 2 ]

1 голос
/ 25 мая 2009

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

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

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

private void PopulateObject(object dataObj, System.Data.DataRow dataRow)
0 голосов
/ 25 мая 2009

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

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

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

Возможно, вы захотите посмотреть и эту запись .

...