是否可以通过属性列表选择匿名类型作为参数。该方法应如下所示:
public void TestLinq(List<"Properties"> properties, List<Data> data)
{
var dat = from d in data select new { properties };
}
我知道描述听起来很笨拙,但我希望能得到一些帮助。
了解我必须寻找这个主题的术语非常重要。
答案 0 :(得分:1)
您可以使用Dynamic LINQ query library(download 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>
参数,然后你就可以访问该类型的成员,但是你不会在编译时进行类型检查。
使用IEnumerable
或IList
的另一种选择。使用其中任何一个都可以在不知道类型的情况下访问集合的成员。这样更安全,因为您拥有所有编译时间检查,但不允许您访问成员或匿名类型。
但实际上,您应该将您的匿名类型转换为真正的类,这样您就可以让您的生活更轻松。
答案 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;转换属性并将其中的许多组合成一个?所以我会得到正确的命令