如何将匿名类型作为参数传递给方法?

时间:2011-12-02 07:54:38

标签: c# linq c#-4.0

  

可能重复:
  What’s the return type of an anonymous class

我正在使用以下查询创建一个匿名类型:

来电者代码:

 var query= from p in _db.ExecuteDataSet(SQL).Tables[0].AsEnumerable()
                        select new {
                                       ProductCode = p.Field<string>("PRODUCT_CODE"),
                                       ProductName = p.Field<string>("PRODUCT_NAME")
                                   };
 foreach(var product in query)
 {
     WriteProduct(product);
 }

方法就像:

void WriteProduct(object prod)
{
  //   access the product
}

我无法获得WriteProduct方法的正确参数类型。请帮帮我。

4 个答案:

答案 0 :(得分:10)

是的,你可以。

public class Program
{
    private static void Thing(dynamic other)
    {
        Console.WriteLine(other.TheThing);
    }

    private static void Main()
    {
        var things = new { TheThing = "Worked!" };
        Thing(things);
    }
}

但作为一个小小的细节,不要!

匿名类型由于某种原因是匿名的,它们不是代码中的第一类实体,它们更方便。如果类型很重要,请将其定义为。

答案 1 :(得分:6)

有三种方式可以与匿名类型进行对话:

  • 反射(通过obj.GetType().GetProperties() / prop.GetValue(obj, null)获取属性等)
  • dynamic(即obj.ProductCodeobj.ProductTypedynamic obj) - 上述
  • 的优化和更漂亮的版本
  • 逐个演示:不要使用

您的WriteProduct必须使用其中之一;或者:使用匿名类型以外的东西;一个Tuple<...>,可能(虽然这往往使得很难知道数据) - 或者是一个适当定义的自定义接口,类或结构。

答案 2 :(得分:2)

如果我错了,请纠正我,但我认为你应该创建一个临时课程来存储产品。

select new TempProduct {
    productCode = p.Field<string>("PRODUCT_CODE"),
    productName = p.Field<string>("PRODUCT_NAME")
};

例如像这样的课程

public class TempProduct
{
    public String productCode { get; set; }
    public String productName { get; set; }
}

答案 3 :(得分:2)

这不是你要求的,但你的选择只有两个属性,那么如何将这两个属性传递给方法呢?

foreach(var product in query) 
{ 
    WriteProduct(product.ProductCode, product.ProductName); 
} 
// ...
void WriteProduct(string productCode, string productName) 
{ 
    // ...
}