public IEnumerable<SelectListItem> Create<TSouce>(List<TSouce> list, Expression<Func<TSouce, object>> text, Expression<Func<TSouce, object>> value, int selectValue) { // Utiliza linq para criar o objeto (dispendando o uso de um forreach) return list.Select( s => new SelectListItem() { // Seta o text propriedade do objeto que e o text do <select> Text = s.GetType() .GetProperty(this.GetPropetionsName(text.Body)) .GetValue(s, null) .ToString(), // Seta o value propriedade do objeto que e o value do <select> Value = s.GetType() .GetProperty(this.GetPropetionsName(value.Body)) .GetValue(s, null) .ToString(), // verifica se o objeto e o que foi selecionado <select> Selected = ( s.GetType() .GetProperty(this.GetPropetionsName(value.Body)) .GetValue(s, null).Equals(selectValue) ) }).AsEnumerable<SelectListItem>(); } /// <summary> /// Retorna o nome da propriedade /// </summary> /// <param name="member">menbro expression</param> /// <returns>nome da propriedade</returns> public string GetPropetionsName(Expression member) { MemberInfo info = null; // Retorna o operador da expressao var nextOperand = member; // Verifica os tipos da arvore de expressao. // ExpressionType.Convert : Uma operacao de conversao ou de conversao, como (SampleType)obj if (nextOperand.NodeType == ExpressionType.Convert) { var unaryExpression = (UnaryExpression)nextOperand; info = (unaryExpression.Operand as MemberExpression).Member; } // ExpressionType.MemberAccess : Uma operacao que le a partir de um campo ou propriedade, como obj.SampleProperty. else if (nextOperand.NodeType == ExpressionType.MemberAccess) { info = (nextOperand as MemberExpression).Member; } // Se nao a expressao nao e assesivel else { throw new ArgumentException("Not a member access", "expression"); } return info.Name; } } } Agora vamos criar um classe userView que contem a cidade utilizaremos agora o dataAnotatios ja que geraremos a tela a partir desta classe. C#<span style="font-size: small;" _mce_style="font-size: small;">using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.ComponentModel.DataAnnotations; using System.Web.Mvc; namespace testeSelectItem.Models { /// <summary> /// Model de usuario /// </summary> public class UserView { /// <summary> /// Codigo do usuario /// </summary> [Required] [Display(Name = "Codigo")] public int idUsuario { get; set; } /// <summary> /// Nome do usuario /// </summary> [Required] [Display(Name = "Nome")] public string nomeUsuario { get; set; } /// <summary> /// Cidade do usuario /// </summary> [Required] [Display(Name = "Cidade")] public IEnumerable<SelectListItem> cidadeUsuario { get; set; } } }</span>Crie agora um controller para user.C#using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using testeSelectItem.Models; using Infraestrutura; namespace testeSelectItem.Controllers { public class UserController : Controller { /// <summary> /// Lista de exemplo /// </summary> public List<Cidades> teste = new List<Cidades>() { new Cidades(){ idCidade = 1,nomeCidade= "belo horizonte"}, new Cidades(){ idCidade = 2,nomeCidade= "sao paulo"}, new Cidades(){ idCidade = 3,nomeCidade= "rio de janeiro"}, }; // // GET: /User/Create public ActionResult Create() { var user = new UserView(); user.cidadeUsuario = new DropDown().Create(teste, x => x.nomeCidade, y => y.idCidade, 0); return View(user); } // // POST: /User/Create [HttpPost] public ActionResult Create(Infraestrutura.Model.User user) { return View(); } } } Veja que no controller no action create foi chamado a classe DropDown repare que no POST existe uma outra classe de User em infraestrutura ela e um POCO que nao vou entrar em detalhes quem sabe numa outra oportunidade.Na view e chamado o dropdown.C#@Html.DropDownListFor(x =>x.cidadeUsuario,Model.cidadeUsuario)Espero que tenha sido util ate mais........