2009-05-25 9 views
1

Je peuplant différents types d'objets à l'datarows avec chaque attrivute de l'objet concerné = au champ Nom Similiarly dans le datarow.Réflexion - réglage Type d'obj retourné?

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

J'ai cependant atteint un autre barrage routier. L'un des attributs est en fait un autre objet appelé Customer, avec 11 attributs de lui-même. Je soupçonne qu'il y a encore plus d'objets imbriqués. Comment gérer le remplissage de ces objets imbriqués, pour lesquels il n'y a qu'un seul champ dans le 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 une correspondance de nom, et définir cet attribut?

ou (comme dans le code ci-dessus) - Appelez le PopulateObject récursive. Cela cependant me pose un problème car le compilateur se plaint où j'essaie de passer le type 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 type « groupe méthode » et« System.Type »

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

Répondre

1

Changer la signature de votre méthode:

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) 
0

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

Si le code lui-même ne fonctionne pas, je pense que le plus gros problème utilise la chaîne « 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 voudrez peut-être Regardez aussi this post.

+0

vous avez raison, j'ai repéré cela quand j'ai couru le code. Est en train de travailler en ce moment. – callisto