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

Akh*_*hil 3 c# linq c#-4.0

可能重复:
匿名类的返回类型是什么

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

来电代码:

 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);
 }
Run Code Online (Sandbox Code Playgroud)

方法如下:

void WriteProduct(object prod)
{
  //   access the product
}
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*ens 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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


Mar*_*ell 6

与匿名类型交谈有3种方式:

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

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