将匿名类型的对象作为参数传递给方法

时间:2013-08-19 21:33:24

标签: c# .net linq list anonymous-types

我需要做这样的事情:

public class carros 
{
    public int id { get; set; }
    public string nome { get; set; }
}

public void listar_carros()
{
    List<carros> cars = new List<carros>();
    cars.Add(new carros{ id= 1, nome = "Fusca" });
    cars.Add(new carros{ id= 2, nome = "Gol" });
    cars.Add(new carros{ id= 3, nome = "Fiesta" });

    var queryResult = from q in cars 
                      where q.nome.ToLower().Contains("eco") 
                      orderby q.nome 
                      select new { q.nome, q.id };

    doSomething(queryResult)
}

我需要将queryResult变量传递给函数doSomething()。我尝试使用动态类型List<T>对象,但没有任何作用

public void doSomething(???? queryResult)
{
    foreach (carros ca in queryResult)
    {
        Response.Write(ca.nome);
        Response.Write(" - ");
        Response.Write(ca.id);
    }
}

4 个答案:

答案 0 :(得分:10)

一般来说,在方法之间传递匿名类型几乎总是一个坏主意。

您应该创建一个自定义类型来保存nomeid值,然后构造它而不是匿名类型。


在您的情况下,您已经有一个可以工作的课程:carros。您只需实现查询即可创建它:

var queryResult = from q in cars 
  where q.nome.ToLower().Contains("eco") 
  orderby q.nome 
  select new carros {q.nome, q.id};

您的方法将是:

public void doSomething(IEnumerable<carros> queryResults)

答案 1 :(得分:3)

只是想要传递关于传递匿名类型的信息,虽然有人提到它通过不同类型的坏juju,你可以...如果你真的想(利用动态)

public void Anon()
{
     var x = new {foo = "bar"};

     AnonReciever(x);
}

public static void AnonReciever(dynamic o)
{
     Console.WriteLine(o.foo);
}

这打印bar没问题。

我不推荐它。最好使用已有的自定义类型对象。

答案 2 :(得分:2)

您不能在当前方法的范围之外传递匿名类型*。使用您的carros类型:

public void listar_carros()
{
    List<carros> Lcars = new List<carros>();
    Lcars.Add(new carros(1, "Fusca"));
    Lcars.Add(new carros(2, "Gol"));
    Lcars.Add(new carros(3, "Fiesta"));

    var qry = from q in Lcars
              where q.nome.ToLower().Contains("eco")
              orderby q.nome
              select q;

    doSomething(qry);

}

public void doSomething(IEnumerable<carros> qry)
{

    foreach (carros ca in qry)
    {
        Response.Write(ca.nome);
        Response.Write(" - ");
        Response.Write(ca.id);
        //Response.Write(ca);
        Response.Write("<br />");
    }
}

*您只能将它们作为object传递,因为您希望以强类型方式使用它们,因此它们几乎无用。

答案 3 :(得分:2)

为什么不将新对象声明为类型carros?

var qry = from q in Lcars 
          where q.nome.ToLower().Contains("eco") 
          orderby q.nome 
          select new carros {q.nome, q.id};

您的参数将是:

 IEnumerable{carros}