1

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

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

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

知道我必须寻找这个主题的术语很重要。

4

4 回答 4

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;
}
于 2012-12-04T21:37:27.760 回答
1

您可以使用动态 LINQ 查询库下载示例)在投影中创建属性列表,如下所示:

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

请注意,返回类型是 type dynamic,因此您将没有编译时检查,除非您是duck-typing,否则您可能对这些字段了解不多。

根据您的需要,最好为此创建强类型(如果这是基于用户输入,那么您显然不能)。

于 2012-12-04T21:24:30.030 回答
0

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

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

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

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

于 2012-12-04T21:24:28.017 回答
0

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

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

是否可以在属性中保护 Expression> 转换器并将它们中的许多组合为一个?所以我会得到正确的订单

于 2012-12-05T15:08:15.070 回答