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?
vous avez raison, j'ai repéré cela quand j'ai couru le code. Est en train de travailler en ce moment. – callisto