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

C# 将匿名类型的对象作为参数传递给方法,c#,.net,linq,list,anonymous-types,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.A

我需要这样做:

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)
}

通常,在方法之间传递匿名类型几乎总是一个坏主意

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


在您的例子中,您已经有了一个可以工作的类:
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)
public void doSomething(IEnumerable queryResults)

您不能将匿名类型*传递到当前方法范围之外。使用您的
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 />");
    }
}
public void listar_carros()
{
列表LCAR=新列表();
Lcars.Add(新卡罗斯(1,“Fusca”);
Lcars.新增(新卡罗斯(2,“Gol”);
Lcars.Add(新卡罗斯(3,“嘉年华”);
var qry=来自LCAR中的q
其中q.nome.ToLower()包含(“eco”)
奥德比·q·诺姆
选择q;
剂量测定法(qry);
}
公共无效剂量测定(IEnumerable qry)
{
foreach(卡罗斯加州qry)
{
响应。写入(约nome);
回答。写(“-”);
响应。写入(ca.id);
//响应。写入(ca);
响应。写入(“
”); } }

*您只能将它们作为
对象进行传递,因为您希望以强类型的方式使用它们,这几乎是无用的。

为什么不将新对象声明为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}

我只是想插嘴一下关于传递匿名类型的问题,虽然有人提到传递anonmyous类型是不好的,但是你可以。。。如果您真的想(利用动态)

这个打印
没问题


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

您能解释一下为什么这是个坏主意吗?他已经有了一个名为
Carros
的对象,它有
nome
id
@Felipemariatomoura:这是个坏主意的原因,因为你创建的匿名类型是匿名的。也就是说:在使用它的LINQ查询之外(反射黑客之外),无法构造它。尽管匿名类型很有用,但它们的作用域仅限于其初始方法。如果你想传递它们,它们显然具有超出初始范围的相关性,因此,它们应该得到一个名称和一个声明;错误:错误3'testeLINQ.carros'不包含接受0个参数的构造函数–@Felipemariatomoura问题是您没有显示
carros
类-您发布的代码将具有默认构造函数。您可能需要使用
选择新的carros(q.nome,q.id)
或类似工具,具体取决于您的类的实际定义方式。不工作动态显示错误“找不到命名空间动态”错误:错误3'testeLINQ.carros'不包含接受0参数的构造函数。ArgumentsOrry使用selec q可以正常工作;但不适用于选定的新carros{q.nome,q.id};或者选择新的{q.nome,q.id};你知道吗?@FelipeMaricatoMoura:所以你更改了所展示的代码示例,然后抱怨你的更改有一个bug(当原始代码没有bug时)?在代码中的单词new上显示错误select new carros{q.nome,q.id};错误:错误3'testeLINQ.carros'不包含接受0个参数的构造函数–在visual studio中,您可以将鼠标悬停在
var
关键字上以查看生成结果的类型。
 IEnumerable{carros}
public void Anon()
{
     var x = new {foo = "bar"};

     AnonReciever(x);
}

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