2017-09-19 3 views
-1

Je voudrais créer une carte avec le nom de l'objet de propriété en tant que clé et une liste de type objet en tant que valeur.Créer une carte de liste générique pour initialiser plusieurs ComboBox en une fois

Dans mon cas, je voudrais avoir une carte:

Dictionary<string, List<Object1 Or 2>> objectToListofObj1Or2 = new Dictionary<string, List<Object1 Or 2>>(); 

je peux avoir soit une liste de contact ou Adresse.

J'ai une méthode pour initialiser ma carte, en ce moment il est AbstractEntity, une superclasse de Adresse et contact:

public Dictionary<string, List<AbstractEntity>> InitializeMapping() 
    { 
     Dictionary<string, List<AbstractEntity>> objectToListContactCorrespondance1 = new Dictionary<string, List<AbstractEntity>>(); 
      objectToListContactCorrespondance1["CodeContactFactAchatExterne"] = ContactsFacturationAchatExterne.Cast<AbstractEntity>().ToList(); 
//my key is the property name, value is my list already created, here is a List of type Contact 
      objectToListContactCorrespondance1["CodeContactContractAchatExterne"] = ContactsContractualisationAchatExterne.Cast<AbstractEntity>().ToList(); 

//here a list of type Adress 
objectToListContactCorrespondance1["CodeAdresseContractAchatExterne"] = AdressesContractualisationAchatExterne.Cast<AbstractEntity>().ToList(); 

Je fais tout cela pour pré sélectionner un grand nombre de rambComboBox avec le CodeAdress ou correspondant CodeContact dans la liste dans la vue comme ceci:

Dictionary<string, List<AbstractEntity>> mapping = InitializeMappingContact(); 
foreach (PropertyInfo propertyInfo in dataInit.GetType().GetProperties()) 
     { 
      if (mapping.ContainsKey(propertyInfo.Name) && (alreadyIn.Where(code => code == propertyInfo.Name).ToList().Count == 0)) 
      { 
       if (mapping[propertyInfo.Name].First().GetType() == typeof(Contact)) 
       { 
        Contact test = (Contact)mapping[propertyInfo.Name].First(); 
        propertyInfo.SetValue(dataInit, mapping[propertyInfo.Name].Count == 1 ? test.CodeContact : null, null); 
       } 
       else 
       { 
        Adresse test = (Adresse)mappingContact[propertyInfo.Name].First(); 
        propertyInfo.SetValue(dataInit, mappingContact[propertyInfo.Name].Count == 1 ? test.CodeAdresse : null, null); 
       } 
      } 
     } 

Ma carte fonctionne maintenant, j'ai ajouté le premier(). Mais mon combobox arent » sélectionné avec cette ligne (dataInit permet mon initialize la vue):

propertyInfo.SetValue(dataInit, mappingContact[propertyInfo.Name].Count == 1 ? test.CodeContact : null, null); 

Sinon, si je n'utilise mon foreach et la méthode Initialize, je dois le faire ligne par ligne manuellement comme ceci:

dataInit.CodeAdresseContractAchatSVD = AdressesContractualisationAchatSVD.Count == 1 ? AdressesContractualisationAchatSVD.First().CodeAdresse : null; 

Je voudrais faire:

dataInit."mapping[propertyInfo.Name]" = mappingContact[propertyInfo.Name].Count == 1 ? (Adress)mappingContact[propertyInfo.Name].First().CodeAdresse : null; 
+0

Comme une note, 'la cartographie [propertyInfo.Name] .GetType() == typeof (Contact)' serait mieux écrire: '' cartographie [propertyInfo.Name] est contact' – Clemens

+0

Pourquoi ne pas utiliser le travail de AbstractEntity ? Que se passe-t-il lorsque vous déboguez le code? – CalC

+0

Je pourrais avoir trouvé quelque chose: mon type de test est faux, je dois faire: mappage [propertyInfo.Name] .FIRST(). GetType() == typeof (Contact) ou pour faire la liste en tant que type correspondant –

Répondre

-1

je devais vérifier si la liste de la carte n'a pas été nulle et alors je pourrais obtenir le type de ma liste:

foreach (PropertyInfo propertyInfo in dataInit.GetType().GetProperties()) 
     { 
      if (mappingContact.ContainsKey(propertyInfo.Name) && (alreadyIn.Where(code => code == propertyInfo.Name).ToList().Count == 0)) 
      { 
       if (mappingContact[propertyInfo.Name].FirstOrDefault() != null) 
       { 
        if (mappingContact[propertyInfo.Name].First().GetType() == typeof(Contact)) 
        { 
         Contact test = (Contact)mappingContact[propertyInfo.Name].First(); 
         propertyInfo.SetValue(dataInit, mappingContact[propertyInfo.Name].Count == 1 ? test.CodeContact : null, null); 
        } 
        else 
        { 
         Adresse test = (Adresse)mappingContact[propertyInfo.Name].FirstOrDefault(); 
         propertyInfo.SetValue(dataInit, mappingContact[propertyInfo.Name].Count == 1 ? test.CodeAdresse : null, null); 
        } 
       } 
      } 
     }