Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将匿名类型作为参数传递给方法?_C#_Linq_C# 4.0 - Fatal编程技术网

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) 
{ 
    // ...
}