c# – 从具有指定属性的泛型类的列表生成HTML表

前端之家收集整理的这篇文章主要介绍了c# – 从具有指定属性的泛型类的列表生成HTML表前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想从几个指定的参数生成一个 HTML表.具体来说,我想传入我的方法的两个参数是:IEnumerable列表和T的属性的一些子集.例如,假设我有一个这个类的列表:
  1. class Person
  2. {
  3. string FirstName
  4. string MiddleName
  5. string LastName
  6. }

让我们来看看这个名单里有5个人.我想通过这样做来获得该类(或任何其他任意类)的HTML表:

  1. List<Person> people;
  2. ...add people to list
  3.  
  4. string HTML = GetMyTable(people,"FirstName","LastName");

我确定有一个更好的方法来指定哪些属性我想要从表生成表(或哪些属性我想从表中排除,这将更好,因为我通常会想要大部分或全部的类的属性),但我“我不知道(我从来没有用过反思,但我猜这是怎么回事).此外,该方法应该接受任何类型的类的列表.

关于如何实现这一点的任何聪明的想法?

解决方法

也许这样吗?
  1. var html = GetMyTable(people,x => x.LastName,x => x.FirstName);
  2.  
  3. public static string GetMyTable<T>(IEnumerable<T> list,params Func<T,object>[] fxns)
  4. {
  5.  
  6. StringBuilder sb = new StringBuilder();
  7. sb.Append("<TABLE>\n");
  8. foreach (var item in list)
  9. {
  10. sb.Append("<TR>\n");
  11. foreach(var fxn in fxns)
  12. {
  13. sb.Append("<TD>");
  14. sb.Append(fxn(item));
  15. sb.Append("</TD>");
  16. }
  17. sb.Append("</TR>\n");
  18. }
  19. sb.Append("</TABLE>");
  20.  
  21. return sb.ToString();
  22. }

– 版本2.0–

  1. public static string GetMyTable<T>(IEnumerable<T> list,params Expression<Func<T,object>>[] fxns)
  2. {
  3.  
  4. StringBuilder sb = new StringBuilder();
  5. sb.Append("<TABLE>\n");
  6.  
  7. sb.Append("<TR>\n");
  8. foreach (var fxn in fxns)
  9. {
  10. sb.Append("<TD>");
  11. sb.Append(GetName(fxn));
  12. sb.Append("</TD>");
  13. }
  14. sb.Append("</TR> <!-- HEADER -->\n");
  15.  
  16.  
  17. foreach (var item in list)
  18. {
  19. sb.Append("<TR>\n");
  20. foreach (var fxn in fxns)
  21. {
  22. sb.Append("<TD>");
  23. sb.Append(fxn.Compile()(item));
  24. sb.Append("</TD>");
  25. }
  26. sb.Append("</TR>\n");
  27. }
  28. sb.Append("</TABLE>");
  29.  
  30. return sb.ToString();
  31. }
  32.  
  33. static string GetName<T>(Expression<Func<T,object>> expr)
  34. {
  35. var member = expr.Body as MemberExpression;
  36. if (member != null)
  37. return GetName2(member);
  38.  
  39. var unary = expr.Body as UnaryExpression;
  40. if (unary != null)
  41. return GetName2((MemberExpression)unary.Operand);
  42.  
  43. return "?+?";
  44. }
  45.  
  46. static string GetName2(MemberExpression member)
  47. {
  48. var fieldInfo = member.Member as FieldInfo;
  49. if (fieldInfo != null)
  50. {
  51. var d = fieldInfo.GetCustomAttribute(typeof(DescriptionAttribute)) as DescriptionAttribute;
  52. if (d != null) return d.Description;
  53. return fieldInfo.Name;
  54. }
  55.  
  56. var propertInfo = member.Member as PropertyInfo;
  57. if (propertInfo != null)
  58. {
  59. var d = propertInfo.GetCustomAttribute(typeof(DescriptionAttribute)) as DescriptionAttribute;
  60. if (d != null) return d.Description;
  61. return propertInfo.Name;
  62. }
  63.  
  64. return "?-?";
  65. }

PS:重复调用fxn.Compile()可以在紧密循环中成为性能杀手.最好在字典中缓存它.

猜你在找的C#相关文章