如何在foreach循环中从Generic <T>获取值

时间:2019-06-26 05:26:03

标签: c# list function generics foreach

我创建了一个支持所有类模型的函数(泛型)。但是我有一个查询要获取每个循环中的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和“值”的empname之类的属性名。
  2. 如果我将学生班级模型传递给该函数,我想访问属性名称,例如“文本”的“ studentid”和“值”的“ studentname”。

2 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是在方法中添加两个参数-文本选择器和值选择器:

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,您可以使用dp:

GetGenericList(someStudentList, x => x.studentid, x => x.studentname);

答案 1 :(得分:1)

您不需要为此要求实现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;
    }

有多种实现方法。我只是给你一个答案。