Pergunta

Eu tenho uma função genérica <> que leva uma consulta LINQ ( 'itens') e enumera através dele acrescentando propriedades adicionais. Como posso selecionar todas as propriedades do 'item' original em vez do próprio item (como o código abaixo faz)?

Assim, equivalente ao sql: select *, 'bar' como Foo dos artigos

foreach (var item in items)
{
    var newItem = new {
        item, // I'd like just the properties here, not the 'item' object!
        Foo = "bar"
    };

    newItems.Add(newItem);
}
Foi útil?

Solução

Não há nenhuma maneira fácil de fazer o que você está sugerindo, como todos os tipos em C # são fortes digitado, mesmo os anónimos que você está usando. No entanto, não é impossível retirá-la. Para fazer isso você teria de utilizar reflexão e emitem sua própria montagem na memória, adicionando um novo módulo e tipo que contém as propriedades específicas que você deseja. É possível obter uma lista de propriedades do seu artigo anônimo usando:

foreach(PropertyInfo info in item.GetType().GetProperties())
    Console.WriteLine("{0} = {1}", info.Name, info.GetValue(item, null));

Outras dicas

atirar em você escreveu exatamente o que eu estava indo para postar. Eu estava apenas começando algum código pronto: /

É um pouco complicado, mas de qualquer maneira:

ClientCollection coll = new ClientCollection();
var results = coll.Select(c =>
{
    Dictionary<string, object> objlist = new Dictionary<string, object>();
    foreach (PropertyInfo pi in c.GetType().GetProperties())
    {
        objlist.Add(pi.Name, pi.GetValue(c, null));
    }
    return new { someproperty = 1, propertyValues = objlist };
});
from item in items
where someConditionOnItem
select
{
     propertyOne,
     propertyTwo
};

Pergunte o item para dar-lhes a você.

A reflexão é uma maneira ... no entanto, uma vez que todas as propriedades são conhecidas em tempo de compilação, cada item pode ter um método que ajuda esta consulta obter o que precisa.

Aqui estão algumas assinaturas exemplo de método:

public XElement ToXElement()
public IEnumerable ToPropertyEnumerable()
public Dictionary<string, object> ToNameValuePairs()

Suponha que você tenha uma coleção de classe Departamento:

   public int DepartmentId { get; set; }
   public string DepartmentName { get; set; }

Em seguida, use tipo anônimo como esta:

        List<DepartMent> depList = new List<DepartMent>();
        depList.Add(new DepartMent { DepartmentId = 1, DepartmentName = "Finance" });
        depList.Add(new DepartMent { DepartmentId = 2, DepartmentName = "HR" });
        depList.Add(new DepartMent { DepartmentId = 3, DepartmentName = "IT" });
        depList.Add(new DepartMent { DepartmentId = 4, DepartmentName = "Admin" });
        var result = from b in depList
                     select new {Id=b.DepartmentId,Damartment=b.DepartmentName,Foo="bar" };
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top