取回匿名类型

时间:2011-09-30 19:04:18

标签: c# winforms anonymous-types

  

可能重复:
  Accessing C# Anonymous Type Objects
  Working with C# Anonymous Types

我正在使用linq来实体从客户表中获取id和全名。

  public IQueryable RegresaClientesPorEmpresa(int id_emp)
    {
        var clientes = from c in context.clientes
                       where c.IDEmpresa == id_emp
                       select new
                       {
                           c.IDCliente,
                           NomComp = c.Nombres +" "+ c.ApellidoP +" "+ c.ApellidoM
                       };
        return clientes;
    }

结果用作组合框的数据源,然后在我的组合中触发SelectionChangeCommitted时,我希望将所选项添加到列表框中:

var clientes = operaciones.RegresaClientesPorEmpresa(2);
 combo_cliente.DataSource = clientes;
 combo_cliente.DisplayMember = "NomComp";
 combo_cliente.ValueMember = "IDCliente";

 listBox_grupo.DisplayMember = "NomComp";
 listBox_grupo.ValueMember = "IDCliente";

 private void combo_cliente_SelectionChangeCommitted(object sender, EventArgs e)
    {
        listBox_grupo.Items.Add(combo_cliente.SelectedItem); 
    }

直到这里一切都很好。最后,我希望从列表框中添加的所有项目中获取所有“IDCliente”的值,问题是我不知道如何操作,因为每个项目都是匿名数据类型。任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:4)

匿名类型的范围仅限于“声明”它的方法(好吧,它没有真正声明,但你明白我的意思)。如果要在另一个方法中使用查询结果,请创建一个命名类型来保存结果。

答案 1 :(得分:2)

如果您希望访问其属性,则不应从方法中返回匿名类型。如果你定义一个类,那么对你来说会更容易,因为这会建立你的方法的契约。

答案 2 :(得分:1)

只需创建一个类以避免匿名类型。

class Foo
{
   public string NomComp {get ; set;}
   public string IDCliente {get ; set;}
}

并做

select new Foo
{
     ...
}

省去一些麻烦。

或您可以定义

T Cast<T>(object obj, T type)
{
   return (T)obj;
}

然后使用

object anonymousObject = GetSelection();
var selection = Cast(anonymousObject , new { IDCliente="", NomComp ="" });

然后您应该能够selection.NomComp获取属性值。