J'ai une liste que je voudrais peupler avec différents types d'objets, essayant de le faire avec objet \ dynamique, mais cela ne le fait pas, même lors de la coulée. Utilisation du noyau ASP.NET. Voir mon code:
public Dictionary<string, Employee> getEmployees(); //This method returns a dictionary of string as a key and Employee as a value. public Dictionary<string, customer>()> getCustomers(); //same principal public List<Dictionary<string, object>> getDifferentItems() { List<Dictionary<string, object>> listOfItems = new List<Dictionary<string, object>>(); listOfItems.add(getEmployees()); //Error listOfItems.add(getCustomers()); //Error return listOfItems; }
4 Réponses :
Il y a quelques problèmes ici, tous deux liés à la variance.
Cela ne fonctionnera pas car En d'autres termes De même , pour Plus d'informations sur la variance peuvent être trouvées ICI . P> P> list
t code> doit être un type spécifique et ne respecte pas l'héritage / la substituabilité, comme avec des types non génériques. P>
Dictionnaire
TVALUE code> n'est pas une variante, vous ne pouvez donc pas simplement utiliser
objet ps> comme valeur. P >
iEnumerable
IMITIONNAIRE CODE > est utilisé, car il s'agit du seul ancêtre commun (autre que l'objet) à
Dictionary
Dictionnaire
getDifferentitems code>. p>
Merci - il est essentiellement utilisé dans une méthode de repos - pour obtenir la collection de tables de recherche statiques. Dans mon code, le conteneur (liste) est remplacé par un dictionnaire
J'entraînerai personnellement une interface, telle que iPerson qui possède toutes les propriétés des employés et des clients, telles que le nom, l'adresse, l'ID, etc.
Configurez vos classes client et d'employé pour mettre en œuvre iPerson P >
Utilisez ensuite un iPerson dans votre dictionnaire et vous pouvez ajouter aux objets à cela. P>
Voici un code: P>
public class Employee : IPerson { public int ID { get; set; } public string Name { get; set; } } public class Customer : IPerson { public int ID { get; set; } public string Name { get; set; } } public interface IPerson { int ID { get; set; } string Name { get; set; } } public class Test { public void MyTest() { List<Dictionary<string, IPerson>> listOfItems = new List<Dictionary<string, IPerson>>(); Dictionary<string, IPerson> myEmployees = new Dictionary<string, IPerson>(); string someString = "blah"; Employee e = new Employee(); e.Name = "Bob"; e.ID = 1; myEmployees.Add(someString, e); Dictionary<string, IPerson> myCustomers = new Dictionary<string, IPerson>(); string someOtherString = "blah"; Customer c = new Customer(); c.Name = "Robert"; c.ID = 2; myCustomers.Add(someOtherString, c); listOfItems.Add(myEmployees); listOfItems.Add(myCustomers); } }
C'était ma pensée initiale, mais les types sont déjà là, très différents, sans propriétés similaires
Si les deux types n'ont pas de propriétés simpliaques, je pense que vous devriez donner plus de pensée au but de faire ce que vous faites. Si les clients et les employés ne sont pas similaires, pourquoi vous retournez-vous une liste de ceux-ci mêlés à l'appelant? Comme vous avez dit que c'était une méthode de repos, il devrait peut-être y avoir des appels distincts pour les employés et les clients ou peut-être y avoir un objet global contenant deux collections, 1 pour les employés et 1 pour les clients. De plus, IPerson pourrait avoir une union des différentes propriétés et que vous ne mettez en œuvre que sur la base de son client ou d'un employé.
Ces 2 objets ne sont que des exemples. Les tables que je me réfèrent ont déjà été mappées sur des types de dictionnaires où leur valeur peut être, par exemple une chaîne atomique ou un objet. De plus, je voudrais faire un appel unique pour toutes les recherches.
Avez-vous pensé à faire un dictionnaire de chaîne et de datatable car vous essayez simplement de restituer toutes les tables de recherche statique?
Non, non pensé, je passe les données comme Json, je ne suis pas sûr que cela ait des avantages
Selon ce que vous essayez de faire, je peux voir deux solutions:
Voici une autre solution:
Est
nouvelle liste code> une faute de frappe?
Liste code> prend uniquement un paramètre de type - Qu'est-ce que vous voulez dire exactement par
list code> ici? Voulez-vous dire que pour être
Dictionnaire code>? ou alors...? Remarque: vous ne pouvez pas lancer un dictionnaire
dictionnaire code> à
Dictionnaire code> - ce n'est pas comment "variance" fonctionne
Tapez les erreurs - désolé, c'est un pseudo code que j'ai écrit. La fixant bientôt
@Johnathan barclay- j'ai corrigé le code
@Marc Gravell - J'ai corrigé le code
Votre liste s'attend à ce que des éléments de type
Dictionnaire code>. Vous ne pouvez pas ajouter d'élément d'un autre type. (E.g.
Liste Code>)