我在IList上构建一个扩展方法,以便能够输出作为列表传递给它的任何对象的指定属性,并将其输出为CSV字符串。它看起来像:
public static string OutputCSVString<T>(this IList<T> list, List<Func<T, string>> properties)
{
foreach (var row in list)
{
foreach(var item in properties)
{
// Do the output work, including calling item(row).
}
// Output new line
}
}
现在,我必须将此方法称为:
// Assuming I've populated List <Product> ProductList up above...
var columns = new List<Func<Product, string>>();
columns.Add(x => x.Id);
columns.Add(x => x.Name);
string s = ProductList.OutputCSVString(columns);
是否有更好的方法来传递我的lambda表达式而无需显式声明columns变量,如:
// This doesn't compile
string s = Products.OutputCSVString(new { p => p.Id , p => p.Name });
答案 0 :(得分:6)
而不是使用List<Func<T, string>>
使用Func<T, string>[]
并将其设为parameter array:
static string OutputCSVString<T>(this IList<T> list,
params Func<T, string>[] properties)
然后你应该可以打电话:
string s = Products.OutputCSVString(p => p.Id , p => p.Name);
请注意,从C#6开始,您应该能够写下:
static string OutputCSVString<T>(this IList<T> list,
params IEnumerable<Func<T, string>> properties)
...这意味着您仍然可以使用List<Func<T, string>>
。
答案 1 :(得分:5)
尝试以params数组传入
public static string OutputSVString<T>(this IList<T> list, params Func<T, string>[] properties)
{
...
}
这将允许您将其作为
调用var s = Products.OutputCSVString(p => p.Id, p => p.Name);
另外,作为建议,放松函数返回对象,然后在组装零件时调用ToString()。这样,您可以传入任何属性以包含在CSV列表中,而不仅仅是字符串。
答案 2 :(得分:4)
您可以将lambdas作为数组传递,并使用params
关键字:
public static string OutputCSVString<T>(this IList<T> list, params Func<T, string>[] properties)
用法:
string s = Products.OutputCSVString(p => p.Id, p => p.Name);