Как получить значение из Generic <T>в цикле foreach - PullRequest
0 голосов
/ 26 июня 2019

Я создал одну функцию (Generic), которая поддерживает все модели классов. но у меня есть запрос, чтобы получить значение общего для каждого цикла.

Это для ASP.NET (MVC), созданного кода в контроллере.

public List<SelectListItem> GetGenericList<T> (list<T> genModel)
{
List<SelectListItem> lst =  new List<SelectListItem>();
foreach(var dyn in lst)
{
    lst.add (new selectlistitem
    {
        text = dyn.??,
        Value = dyn.??
    });
}

}

  1. если я передам модель класса сотрудника этой функции, я хочу получить доступ к атрибуту, например empid для "text" и empname для "value".
  2. если я передам модель класса студента этой функции, я хочу получить доступ к имени атрибута, например, studentid для «текста» и имя студента для «значения».

Ответы [ 2 ]

1 голос
/ 26 июня 2019

Вам не нужно реализовывать Generics для этого требования. Все, что вам нужно сделать, это иметь посредника по умолчанию между вашими классами.

Просто создайте общий интерфейс для ваших моделей

interface IModelInterface
{
    int Id { get; set; }
    string Name { get; set; }
}

И ваш класс должен реализовать интерфейс как

    public class Student : IModelInterface
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class Employee : IModelInterface
{
    public int Id { get; set; }
    public string Name { get; set; }
}

И небольшие изменения в вашем методе GetGenericList

 public List<SelectListItem> GetListItems(List<IModelInterface> genModel)
    {
        List<SelectListItem> lst = new List<SelectListItem>();
        foreach (var dyn in genModel)
        {
            lst.Add(new SelectListItem
            {
                Text = dyn.Name,
                Value = Convert.ToString(dyn.Id)
            });
        }

        return lst;
    }

Есть несколько способов реализовать это. Я только что дал вам один из тех ответов.

1 голос
/ 26 июня 2019

Один из способов сделать это - добавить еще два параметра в ваш метод - текстовый селектор и селектор значений:

public List<SelectListItem> GetGenericList<T> (list<T> genModel, Func<T, string> textSelector, Func<T, string> valueSelector)
{
    List<SelectListItem> lst =  new List<SelectListItem>();
    // loop through genModel, not lst!
    foreach(var model in genModel)
    {
        lst.add (new SelectListItem
        {
            Text = textSelector(model), // Note how we use the selectors here
            Value = valueSelector(model)
        });
    }
    return lst;
}

Чтобы использовать этот метод, скажем, Employee, вы делаете этокак это:

GetGenericList(someEmployeeList, x => x.empid, x => x.empname);

Для Student, вы можете дп:

GetGenericList(someStudentList, x => x.studentid, x => x.studentname);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...