Не удается преобразовать из пользовательского объекта в объект или динамический - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть список, который я хотел бы заполнить различными типами объектов, пытаясь сделать это с помощью объекта \ dynamici c, но это не так, даже при приведении типов. используя asp. net ядро. Смотрите мой код:

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 ]

1 голос
/ 27 февраля 2020

В зависимости от того, что вы пытаетесь сделать, я вижу два решения:

Создание списка из двух разных словарей

    public Dictionary<string, Employee> getEmployees() {
        return new Dictionary<string, Employee>();
    }
    public Dictionary<string, Customer> getCustomers() {
        return new Dictionary<string, Customer>();
    }


    public List<Dictionary<string, object>> getDifferentItems()
    {
        List<Dictionary<string, object>> listOfItems = new List<Dictionary<string, object>>();
        listOfItems.Add(this.getEmployees().ToDictionary(entry => (string)entry.Key,
                  entry => (object)entry.Value)); 
        listOfItems.Add(this.getCustomers().ToDictionary(entry => (string)entry.Key,
                  entry => (object)entry.Value)); 
        return listOfItems;
    }

Создание одного словаря со всеми значениями

    public Dictionary<string, Employee> getEmployees() {
        return new Dictionary<string, Employee>();
    }
    public Dictionary<string, Customer> getCustomers() {
        return new Dictionary<string, Customer>();
    }


    public Dictionary<string, object> getDifferentItems()
    {
        Dictionary<string, object> listOfItems = new Dictionary<string, object>();
        foreach (var entry in getEmployees()) {
            listOfItems.Add(entry.Key, entry.Value);
        }
        foreach (var entry in getCustomers()) {
            listOfItems.Add(entry.Key, entry.Value);
        }
        return listOfItems;
    }
0 голосов
/ 27 февраля 2020

Вот еще одно решение:

    public class Test
    {
        Dictionary<string, object> listOfItems = new Dictionary<string, object>();
        List<Employee> employees = new List<Employee>();
        List<customer> customers = new List<customer>();
        public Dictionary<string, object> getEmployees()
        {
            return employees.GroupBy(x => x.name, y => (object)y).ToDictionary(x => x.Key, y => y.FirstOrDefault());

        }//This method returns a dictionary of string as a key and Employee as a value.
        public Dictionary<string, object> getCustomers()
        {
            return customers.GroupBy(x => x.name, y => (object)y).ToDictionary(x => x.Key, y => y.FirstOrDefault());
        } //same principal 
        public Dictionary<string, object> getDifferentItems()
        {
            listOfItems = getEmployees();
            listOfItems.Concat(getCustomers());
            return listOfItems;
        }
    }
    public class Employee
    {
        public string name { get;set;}
    }
    public class customer
    {
        public string name { get;set;}
    }
0 голосов
/ 27 февраля 2020

Я бы лично создал интерфейс, такой как IPerson, который имеет все свойства сотрудников и клиентов, такие как имя, адрес, идентификатор и т. Д. c.

Настройка классов клиентов и сотрудников для реализации IPerson

Затем используйте IPerson в своем словаре, и вы можете добавить к нему объекты.

Вот некоторый код:

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);
        }
    }
0 голосов
/ 27 февраля 2020

Здесь есть несколько проблем, связанных с дисперсией.

Это не сработает, потому что List<T> или любой другой класс в. NET не поддерживает дисперсию.

Другими словами T должен быть специфицированным c типом и не учитывает наследование / заменяемость, как с не универсальными c типами.

Аналогично для Dictionary<TKey, TValue>, TValue не является вариантом, поэтому вы не можете просто использовать object в качестве значения.

IEnumerable<out T> с другой стороны является ковариантным, поэтому вы можете сделать это:

public IEnumerable<IDictionary> getDifferentItems()
{
   yield return getEmployees();
   yield return getCustomers();
}

IDictionary используется, поскольку это единственный общий предок (кроме объекта) для Dictionary<string, Employee> и Dictionary<string, Customer>.

Это может удовлетворить ваши требования, но вы не ясно вы пытаетесь достичь с помощью getDifferentItems метода.

Более подробную информацию о дисперсии можно найти здесь .

...