2011-12-02 181 views
3

可能重复:
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方法的正确参数类型。请帮帮我。

+3

匿名类型几乎是他们所称的:它们没有名称。如果它没有名称,则不能引用它。如果你想能够引用它,请将它设置为完整的类或结构体。 – zneak

+0

@zneak:匿名类型具有在编译时已知的类型名称。你可以像这样得到它:product.GetType()。FullName。这对OP没有帮助,但您的评论并不完全正确。 –

+0

@Eric J.我纠正了。 – zneak

回答

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

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

匿名类型由于某种原因是匿名的,它们不是代码中的头等实体,它们更方便。如果某种类型非常重要,请将其定义为这样。

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; } 
} 
+0

+1;我会让名字有首字母大写,即使这是一个使用有限的类。 'ProductCode'而不是'productCode'。 –

+0

是的,我在开始的时候就是这样想的,但着色可能会让某人感到困惑,因为它的颜色像一个班级。但我在这里和你在一起! – Niklas

6

有3种方法交谈匿名类型:

  • 反射(通过obj.GetType().GetProperties()/prop.GetValue(obj, null)获得的属性等)
  • dynamic(即obj.ProductCodeobj.ProductType,对于dynamic obj ) - 优化的和的漂亮版本上述
  • 铸造按示例:不使用

WriteProduct必须使用这些中的一个;或者:使用除匿名类型以外的其他内容;一个Tuple<...>,也许(虽然这往往会使它很难知道什么数据) - 或适当定义的自定义接口,类或结构。

+1

“以身作则”? (我不会使用它,我保证!) –

+0

@GeorgeDuckett有一些令人讨厌的方式可以滥用(在模块内保证)事实,即具有相同名称和相同类型的两个匿名类型在相同顺序中将是相同类型。例如,您可以在方法内部创建一个双值对象,并使用它来欺骗泛型类型推断,将未知值输入到该类型中。杂乱,真的非常脆弱。 http://pastie.org/2953799 –

+0

啊,聪明的东西。我绝对不会使用它;看起来真的很像一些非常臭的代码! –

2

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

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