0
votes

Impossible de convertir de l'objet personnalisé en objet ou dynamique

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


6 commentaires

Est nouvelle liste une faute de frappe?


Liste prend uniquement un paramètre de type - Qu'est-ce que vous voulez dire exactement par list ici? Voulez-vous dire que pour être Dictionnaire ? ou alors...? Remarque: vous ne pouvez pas lancer un dictionnaire dictionnaire à Dictionnaire - 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 . Vous ne pouvez pas ajouter d'élément d'un autre type. (E.g. Liste )


4 Réponses :


0
votes

Il y a quelques problèmes ici, tous deux liés à la variance.

Cela ne fonctionnera pas car list ou toute autre classe dans .NET à ce sujet, ne pas Variance de support.

En d'autres termes t doit être un type spécifique et ne respecte pas l'héritage / la substituabilité, comme avec des types non génériques.

De même , pour Dictionnaire , TVALUE n'est pas une variante, vous ne pouvez donc pas simplement utiliser objet comme valeur.

iEnumerable d'autre part est covariant afin que vous puissiez faire cela: xxx

IMITIONNAIRE est utilisé, car il s'agit du seul ancêtre commun (autre que l'objet) à Dictionary et Dictionnaire < p> Ceci peut satisfaire à vos besoins, mais vous ne faites pas de précision que vous essayez de faire votre travail avec votre getDifferentitems .

Plus d'informations sur la variance peuvent être trouvées ICI .


1 commentaires

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 > Pour obtenir l'identifiant pour le nom de la table en tant que clé et son contenu (clé, valeur) en tant que valeur



0
votes

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


5 commentaires

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



1
votes

Selon ce que vous essayez de faire, je peux voir deux solutions:

créer une liste de deux dictionnaires différents xxx

créer un dictionnaire avec toutes les valeurs xxx


0 commentaires

0
votes

Voici une autre solution: xxx


0 commentaires