C# 如何将匿名类型作为参数传递给方法?
可能重复:C# 如何将匿名类型作为参数传递给方法?,c#,linq,c#-4.0,C#,Linq,C# 4.0,可能重复: 我正在使用如下查询创建一个匿名类型: 呼叫方代码: var query= from p in _db.ExecuteDataSet(SQL).Tables[0].AsEnumerable() select new { ProductCode = p.Field<string>("PRODUCT_CODE"),
我正在使用如下查询创建一个匿名类型: 呼叫方代码:
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);
}
我无法为
WriteProduct
方法获取正确的参数类型。请帮助我。如果我错了,请纠正我,但我认为您应该创建一个临时类来存储产品
select new TempProduct {
productCode = p.Field<string>("PRODUCT_CODE"),
productName = p.Field<string>("PRODUCT_NAME")
};
有3种与匿名类型交谈的方式:
- 反射(通过
/obj.GetType().GetProperties()
等获取属性)prop.GetValue(obj,null)
(即dynamic
和obj.ProductCode
,用于obj.ProductType
)-上述的优化和更美观的版本dynamic obj
- 举例说明:不要使用
WriteProduct
必须使用其中之一;或者:使用匿名类型以外的其他类型;可能是一个元组(尽管这会让人很难知道数据是什么)-或者是一个适当定义的自定义接口、类或结构。是的,您可以
public class Program
{
private static void Thing(dynamic other)
{
Console.WriteLine(other.TheThing);
}
private static void Main()
{
var things = new { TheThing = "Worked!" };
Thing(things);
}
}
但作为一个小细节,不要强>
匿名类型是匿名的,因为它们不是代码中的第一类实体,它们更方便。如果某个类型如此重要,请将其定义为该类型。这并不完全是您所要求的,但是您的select只有两个属性,那么将这两个属性传递给该方法如何
foreach(var product in query)
{
WriteProduct(product.ProductCode, product.ProductName);
}
// ...
void WriteProduct(string productCode, string productName)
{
// ...
}
匿名类型和它们的名字差不多:它们没有名字。如果它没有名字,你就不能引用它。如果希望能够引用它,请将其设置为一个完整的类或结构。@zneak:匿名类型的类型名在编译时是已知的。您可以这样得到它:product.GetType().FullName。这对OP没有帮助,但你的评论并不完全正确。“以身作则”?(我保证我不会使用它!)@geogeduckett有一些令人讨厌的方法可以滥用(在模块中保证)两个具有相同名称和相同顺序的相同类型的anon类型将是相同类型这一事实。例如,您可以在方法内创建一个twin值,并使用该值欺骗泛型类型推断,将未知值键入该类型。凌乱而且非常脆弱。啊,聪明的东西。我绝对不会用它;看起来真像是一些很臭的代码+1.我会让名字有首字母大写,即使这是一个使用有限的类ProductCode
而不是ProductCode
。是的,我一开始就是这样的,但是颜色可能会让人困惑,因为它的颜色像一个类。但我支持你!
public class Program
{
private static void Thing(dynamic other)
{
Console.WriteLine(other.TheThing);
}
private static void Main()
{
var things = new { TheThing = "Worked!" };
Thing(things);
}
}
foreach(var product in query)
{
WriteProduct(product.ProductCode, product.ProductName);
}
// ...
void WriteProduct(string productCode, string productName)
{
// ...
}