我可以避免使用上面的Description属性以避免代码复杂化

问题描述 投票:0回答:1

我在做什么:我正在基于我的列表在c#中制作HTML表

这里是我正在使用的课程:

using System;
using System.ComponentModel;

namespace MyDto
{
    public class RegInfoDto
    {
        [Description("Title")]
        public string Title { get; set; }

        [Description("Registration Number")]
        public string RegistrationNumber { get; set; }

        [Description("Registration Date")]
        public DateTime RegistrationDate { get; set; }

        [Description("Registration Amount")]
        public decimal RegistrationAmount { get; set; }

        [Description("Account Number")]
        public string AccountNumber { get; set; }
    }
}

这是我创建html表的地方,传递了一个列表,并传递了代表我的类属性的lambda表达式。

string htmlTable = MakeHtml(RegistrationItems, x => x.Title, x => x.RegistrationNumber, x => x.RegistrationDate, x => x.RegistrationAmount, x => x.AccountNumber);

public static string MakeHtml<T>(IEnumerable<T> dataList, params Expression<Func<T, object>>[] columns)
{
    StringBuilder sb = new StringBuilder();

    // Table Header
    sb.Append("<TABLE>\n");
    sb.Append("<TR>\n");
    foreach (var header in columns)
    {
        sb.Append("<TH>");
        sb.Append(GetPropName(header));
        sb.Append("</TH>");
    }
    sb.Append("<TR>\n");

   // Table Body
}

所有这些都很好,但是我遇到了一个问题,问题是我的标题列的写法与我的Properties完全一样,这有点逻辑:

enter image description here

所以我在Description的顶部添加了Properties

现在我写了一个可以得到Description的方法:

static string GetDescription(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 "";
}

所以我得到的结果很好:

enter image description here

现在,我想知道是否可以用Dictionary或其他方式解决它,因为我从未在应用程序中使用过Description,所以我也不想标记此类。我喜欢保持我所有班级的一致性,并遵循一个约定。

c# html asp.net-core func lambdaexpression
1个回答
0
投票

[如果要使用属性名称,但要对其进行一些清理(例如,在单词之间放置空格),则可以使用类似以下内容的内容:Splitting CamelCase

但是,如果这是商业软件,则不应使用两者。相反,您应该定义字符串资源(在.resx文件中),并使用属性名称(可能与前缀连接)查找描述。

RESX:

<data name="HtmlTable.Description.RegistrationNumber" xml:space="preserve">
    <value>Registration Number</value>
</data>

c#:

var description = resourceManager.GetString("HtmlTable.Description." + property.Name);

这将使您可以独立于代码来更新字符串资源并支持国际化(有关您的应用程序崩溃并走向全球的情况。)>

© www.soinside.com 2019 - 2024. All rights reserved.