加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 06:53:28 所属栏目:百科 来源:网络整理
导读:我想从几个指定的参数生成一个 HTML表.具体来说,我想传入我的方法的两个参数是:IEnumerable列表和T的属性的一些子集.例如,假设我有一个这个类的列表: class Person{ string FirstName string MiddleName string LastName} 让我们来看看这个名单里有5个人.
我想从几个指定的参数生成一个 HTML表.具体来说,我想传入我的方法的两个参数是:IEnumerable列表和T的属性的一些子集.例如,假设我有一个这个类的列表:
class Person
{
  string FirstName
  string MiddleName
  string LastName
}

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

List<Person> people;
...add people to list

string HTML = GetMyTable(people,"FirstName","LastName");

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

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

解决方法

也许这样吗?
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();
}

– 版本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()可以在紧密循环中成为性能杀手.最好在字典中缓存它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读