我正在使用以下查询创建一个匿名类型:
来电者代码:
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
方法的正确参数类型。请帮帮我。
答案 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.ProductCode
和obj.ProductType
,dynamic 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)
{
// ...
}