【问题标题】:Passing object of anonymous type as parameter to a method将匿名类型的对象作为参数传递给方法
【发布时间】:2013-08-19 21:33:24
【问题描述】:

我需要这样做:

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&lt;T&gt; 对象,但没有任何效果

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

【问题讨论】:

  • 在visual studio中,您可以将鼠标悬停在var关键字上,查看生成结果的类型。

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


【解决方案1】:

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

您应该创建一个自定义类型来保存 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)

【讨论】:

  • 你能解释一下为什么这是个坏主意吗?他有一个对象已经称为Carros,其中有nomeid
  • @FelipeMaricatoMoura:这是一个坏主意的原因是因为您创建的匿名类型是 anonymous。也就是说:没有办法在使用它的 LINQ 查询之外构建它(反射黑客之外)。尽管匿名类型很有帮助,但它们的范围仅限于其初始方法。如果您想传递它们,它们显然具有超出初始范围的相关性,因此值得命名和声明。
  • 错误显示在代码中的新词 select new carros {q.nome, q.id};错误:错误 3 'testeLINQ.carros' 不包含采用 0 个参数的构造函数——
  • @FelipeMaricatoMoura 问题是你没有显示你的carros 类——你发布的代码会有一个默认的构造函数。您可能需要使用 select new carros(q.nome, q.id) 或类似名称,具体取决于您的类的实际定义方式。
【解决方案2】:

只是想就传递匿名类型发表意见,虽然有人提到传递匿名类型是不好的 juju,但你可以......如果你真的想要(利用动态)

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

     AnonReciever(x);
}

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

这打印bar没问题。

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

【讨论】:

  • 不工作动态显示错误“找不到动态命名空间”
【解决方案3】:

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

【讨论】:

  • 错误:错误 3 'testeLINQ.carros' 不包含采用 0 个参数的构造函数
【解决方案4】:

您不能在当前方法的范围之外传递匿名类型*。使用您的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 传递,这几乎是无用的,因为您希望以强类型的方式使用它们。

【讨论】:

  • 抱歉,使用 selec q 可以正常工作;但不适用于 select new carros {q.nome, q.id};或选择新的 {q.nome, q.id};你知道吗?
  • @FelipeMaricatoMoura:所以您更改了提供的代码示例,然后抱怨您的更改有错误(而原始代码没有)?
  • 错误显示代码中的新词 select new carros {q.nome, q.id};错误:错误 3 'testeLINQ.carros' 不包含采用 0 个参数的构造函数——
猜你喜欢
  • 2022-01-22
  • 2012-01-11
  • 1970-01-01
  • 2012-12-24
  • 1970-01-01
  • 1970-01-01
  • 2015-04-20
  • 2015-12-26
  • 2015-11-22
相关资源
最近更新 更多