多分このような何か?
var html = GetMyTable(people, x => x.LastName, x => x.FirstName);
public static string GetMyTable<T>(IEnumerable<T> list,params Func<T,object>[] fxns)
{
StringBuilder sb = new StringBuilder();
sb.Append("<TABLE>\n");
foreach (var item in list)
{
sb.Append("<TR>\n");
foreach(var fxn in fxns)
{
sb.Append("<TD>");
sb.Append(fxn(item));
sb.Append("</TD>");
}
sb.Append("</TR>\n");
}
sb.Append("</TABLE>");
return sb.ToString();
}
--version 2.0--
public static string GetMyTable<T>(IEnumerable<T> list, params Expression<Func<T, object>>[] fxns)
{
StringBuilder sb = new StringBuilder();
sb.Append("<TABLE>\n");
sb.Append("<TR>\n");
foreach (var fxn in fxns)
{
sb.Append("<TD>");
sb.Append(GetName(fxn));
sb.Append("</TD>");
}
sb.Append("</TR> <!-- HEADER -->\n");
foreach (var item in list)
{
sb.Append("<TR>\n");
foreach (var fxn in fxns)
{
sb.Append("<TD>");
sb.Append(fxn.Compile()(item));
sb.Append("</TD>");
}
sb.Append("</TR>\n");
}
sb.Append("</TABLE>");
return sb.ToString();
}
static string GetName<T>(Expression<Func<T, object>> expr)
{
var member = expr.Body as MemberExpression;
if (member != null)
return GetName2(member);
var unary = expr.Body as UnaryExpression;
if (unary != null)
return GetName2((MemberExpression)unary.Operand);
return "?+?";
}
static string GetName2(MemberExpression member)
{
var fieldInfo = member.Member as FieldInfo;
if (fieldInfo != null)
{
var d = fieldInfo.GetCustomAttribute(typeof(DescriptionAttribute)) as DescriptionAttribute;
if (d != null) return d.Description;
return fieldInfo.Name;
}
var propertInfo = member.Member as PropertyInfo;
if (propertInfo != null)
{
var d = propertInfo.GetCustomAttribute(typeof(DescriptionAttribute)) as DescriptionAttribute;
if (d != null) return d.Description;
return propertInfo.Name;
}
return "?-?";
}
PS:繰り返しfxn.Compile()
を呼び出すと、タイトなループでのパフォーマンスキラーすることができます。それを辞書にキャッシュする方が良いかもしれません。
public static string GetMyTable(IEnumerable list, params string[] columns)
{
var sb = new StringBuilder();
foreach (var item in list)
{
//todo this should actually make an HTML table, not just get the properties requested
foreach (var column in columns)
sb.Append(item.GetType().GetProperty(column).GetValue(item, null));
}
return sb.ToString();
}
//used like
string HTML = GetMyTable(people, "FirstName", "LastName");
または使用してラムダ:ラムダで
public static string GetMyTable<T>(IEnumerable<T> list, params Func<T, object>[] columns)
{
var sb = new StringBuilder();
foreach (var item in list)
{
//todo this should actually make an HTML table, not just get the properties requested
foreach (var column in columns)
sb.Append(column(item));
}
return sb.ToString();
}
//used like
string HTML = GetMyTable(people, x => x.FirstName, x => x.LastName);
、何が起こっていることは、あなたはそれぞれを取得するためにGetMyTable
メソッドにメソッドを渡しているある
たとえば、intと文字列を選択しようとするとどうなりますか? 'P'は' object'になるか、コンパイルされませんか? –
@TimS。ありがとう、私は答えを更新しました。 –
"fxn(item)"は何をしているのか説明できますか? – birdus