Question

Je peuplant différents types d'objets à l'datarows avec chaque attrivute de l'objet concerné = au champ Nom Similiarly dans le datarow.

Je voudrais utiliser une fonction générique pour ce faire. Comment puis-je forcer le type de l'objet de retour de la fonction générique. Je ne sais pas encore ce que la syntaxe <T> signifie en fait:  PopulateObject<T> ne retourne pas le type que j'obtiens l'erreur du compilateur - Impossible de convertir implicitement le type « objet » à « jobcard » Voir mon code ci-dessous

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

---- mis à jour après le 2 réponse ----

en utilisant ce code: privé 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;
}

Je l'ai frappé un autre barrage routier bien. L'un des attributs est en fait un autre objet appelé Client, avec 11 attributs de son propre. Je soupçonne même sont des objets plus imbriqués encore tapi. Comment puis-je gérer le peuplement de ces objets imbriqués, pour lesquels il n'y a que 1 dans le champ datarow?.

Pour gérer ces objets: - Je dois extraire le type ChildObj dans le parent Objdata - appeler une fonction ProcessChildObj () auquel je passe la ChildObjType et la datarow complète - et ProcessChildObj () faire un match de nom, et définir cet attribut

?

ou (comme dans le code ci-dessus) - Appelez le PopulateObject récursive. Cela me présente cependant un problème que le compilateur se plaint où je tente de passer le type de obj dans l'appel récursif:

propertyitem.SetValue (dataObj, PopulateObject (PropertyItem, datarow), NULL); // provoque compilateur msg « opérateur « < » ne peut pas être appliqué aux opérandes de « groupe de méthode » type et « System.Type » »

Comment puis-je extraire le type de childObj imbriqué pour passer le type comme paramètre?

Était-ce utile?

La solution

Modifier la signature de votre méthode pour:

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

Aussi, je pense que vous n'avez pas besoin de retourner un objet parce que votre mise à jour seulement un objet existant. Vous pouvez simplement utiliser:

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

Autres conseils

Re retourner ... pourquoi retourner? Vous avez déjà mis à jour il ... l'appelant verra le changement. Et si vous n'utilisez pas génériques dans la méthode (vous n'êtes pas) et il suffit d'utiliser object pas génériques.

Si le code lui-même ne fonctionne pas, je pense que le plus gros problème est d'utiliser le string "propertyitem.Name", plutôt que d'évaluer la valeur de la propriété: propertyitem.Name:

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

Vous pouvez regarder ce poste trop .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top