Pergunta

Eu estou preenchendo tipos diferentes objetos com DataRows com cada attrivute do objeto relevante = ao campo do nome similiarly na datarow.

Eu gostaria de usar uma função genérica para fazer isso. Como faço para forçar o tipo do objeto de retorno da função genérico. Eu ainda não sei o que a sintaxe <T> realmente significa: PopulateObject<T> não retorna o tipo que eu recebo erro do compilador - Não é possível converter implicitamente tipo 'objeto' para 'Jobcard' Ver o meu código abaixo

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;
}

---- atualizado após 2ª resposta ----

usando este código: 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;
}

Eu ter atingido outro obstáculo embora. Um dos atributos é realmente um outro objeto chamado cliente, com 11 atributos de si própria. Eu suspeito que há ainda são objetos mais aninhados ainda à espreita. Como eu iria lidar com o povoamento destes objetos aninhados, para quem há apenas 1 campo na datarow?.

Para lidar com esses objetos: - Eu teria que extrair o tipo ChildObj no pai Objdata - chamar uma função ProcessChildObj () para que eu passar o ChildObjType, eo datarow completa ? - e em ProcessChildObj () faz uma correspondência de nome e conjunto que atributo

ou (como no código acima) - Chame o PopulateObject de forma recursiva. Este, porém, apresenta-me com um problema como o compilador reclama que eu tento passar o tipo obj para a chamada recursiva:

propertyitem.SetValue (dataObj, PopulateObject (PropertyItem, datarow), null); // causa compilador msg "Operador '<' não pode ser aplicado a operandos do tipo 'método de grupo' e 'System.Type'"

Como faço para extrair o tipo de childObj aninhada para passar o tipo como um parâmetro?

Foi útil?

Solução

assinatura Mudança do seu método para:

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

Além disso, eu acho que você não precisa devolver qualquer objeto porque a sua única atualização de um objeto existente. Você pode apenas usar:

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

Outras dicas

Re devolvê-lo ... por devolvê-lo? Você já atualizou-lo ... o chamador vai ver a mudança. E se você não estiver usando os genéricos no método (que não são) apenas usar object e não genéricos.

Se o código em si não funcionar, eu acho que o maior problema está usando o string "propertyitem.Name", em vez de avaliar o valor da propriedade: propertyitem.Name:

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

Você pode querer olhar em este post demais .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top