我在做什么:我正在基于我的列表在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完全一样,这有点逻辑:
所以我在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 "";
}
所以我得到的结果很好:
现在,我想知道是否可以用Dictionary
或其他方式解决它,因为我从未在应用程序中使用过Description
,所以我也不想标记此类。我喜欢保持我所有班级的一致性,并遵循一个约定。
[如果要使用属性名称,但要对其进行一些清理(例如,在单词之间放置空格),则可以使用类似以下内容的内容: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);
这将使您可以独立于代码来更新字符串资源并支持国际化(有关您的应用程序崩溃并走向全球的情况。)>