Linq匿名属性超过参数

时间:2012-12-04 16:58:23

标签: c# linq generics

是否可以通过属性列表选择匿名类型作为参数。该方法应如下所示:

public void TestLinq(List<"Properties"> properties, List<Data> data)
{
    var dat = from d in data select new { properties };
}

我知道描述听起来很笨拙,但我希望能得到一些帮助。

了解我必须寻找这个主题的术语非常重要。

4 个答案:

答案 0 :(得分:1)

您可以使用Dynamic LINQ query librarydownload the sample)在投影中创建属性列表,如下所示:

public dynamic TestLinq(IEnumerable<Data> data, IEnumerable<string> properties)
{
    // Validate parameters.
    if (properties == null) throw new ArgumentNullException("properties");
    if (data == null) throw new ArgumentNullException("data");

    // Construct the field list.
    var fields = new StringBuilder();
    foreach (string p in properties) fields.AppendFormat("{0},", property);

    // Throw an exception if there are no items.
    if (fields.Length == 0) throw new ArgumentException(
        "The properties enumeration contains no elements.", "properties");

    // Remove the last comma.
    fields.Length--;

    // Select the items and return.  Create the
    // projection here.
    return data.Select("new(" + fields + ")");
}

请注意,返回类型的类型为dynamic,因此您没有编译时检查,除非您是duck-typing,否则您可能对字段知之甚少

可能最好为此创建强类型,具体取决于您的需求(如果这是基于用户输入,那么您显然不能)。

答案 1 :(得分:1)

在这里,这是基于这个答案https://stackoverflow.com/a/5310828/491950

List<string> properties = new List<string>() { {"ResultPrefix"}, {"ProfileResult"}};

foreach (dynamic d in ListProperties(properties, cellValues))
{
     Console.WriteLine(d.ResultPrefix);
}


public static List<dynamic> ListProperties(List<string> properties, List<ChemistryResult> chemistryResults)
{
    List<dynamic> output = new List<dynamic>();

    foreach (ChemistryResult chemistryResult in chemistryResults)
    {
        IDictionary<string, Object> result = new ExpandoObject();

        foreach (string property in properties)
        {
            PropertyInfo propertyInfo = typeof(ChemistryResult).GetProperty(property);

            result[property] = propertyInfo.GetValue(chemistryResult);
        }

        output.Add(result);
    }

    return output;
}

答案 2 :(得分:0)

您不能在方法签名中使用匿名类型。它不能用作参数或返回类型。

你可以做的是将参数声明为dynamic,但动态可以变得非常粘,所以我建议避免使用它。你可以有List<dynamic>参数,然后你就可以访问该类型的成员,但是你不会在编译时进行类型检查。

使用IEnumerableIList的另一种选择。使用其中任何一个都可以在不知道类型的情况下访问集合的成员。这样更安全,因为您拥有所有编译时间检查,但不允许您访问成员或匿名类型。

但实际上,您应该将您的匿名类型转换为真正的类,这样您就可以让您的生活更轻松。

答案 3 :(得分:0)

我很抱歉这个混乱。结果应该是一个正确的csv。用户应该能够定义列的顺序。但对我来说,很难提出一个好问题。我正在寻找一个没有反射的expresisons解决方案。我的想法是生成一个匿名对象列表(使用正确的顺序),然​​后我想创建csv。所以我知道以下是有效的:

public void Get(List<Value> data,Expression<Func<Value, T>> converter)
{
    var dat = from d in data
     select
         new
         {
               converter
         };
}

是否可以安全表达&gt;转换属性并将其中的许多组合成一个?所以我会得到正确的命令