更改客户端输出的属性名称

时间:2014-11-05 15:33:37

标签: c# reflection

我正在编写一些代码,这些代码将发送一封电子邮件,其中包含类属性内部的详细信息。

我认为最好通过reflection

执行此操作,而不是使用属性对行进行硬编码
var builder = new StringBuilder();

Type type = obj.GetType();
PropertyInfo[] properties = type.GetProperties();

foreach (PropertyInfo property in properties)
{
    if (property.GetValue(obj, null) != null)
    {
        builder.AppendLine("<tr>");
        builder.AppendLine("<td>");

        builder.AppendLine("<b> " + property.Name + " </b>");

        builder.AppendLine("</td>");
        builder.AppendLine("<td>");

        builder.AppendLine(property.GetValue(obj, null).ToString());

        builder.AppendLine("</td>");
        builder.AppendLine("</tr>");
    }
}

这也有助于省去所有尚未设置的属性,这有助于减少代码。

但是property.Name非常正确地输出当前形式的属性名称

public string PropertyA { get; set; }

所以电子邮件看起来像

PropertyA : 123

对用户来说这看起来不友好。那么有没有办法可以更改属性名称以显示不同的内容?

我试过了

[DisplayName("Property A")]
public string PropertyA { get; set; }

应该在电子邮件中显示:

Property A : 123

但是没有优势......在我要走的逻辑道路上有什么可以帮助的吗?

谢谢

2 个答案:

答案 0 :(得分:2)

您需要find the attribute and extract the Name value

var displayNameAttribute = property.GetCustomAttributes
                                    (typeof(DisplayNameAttribute), false)
                                    .FirstOrDefault() as DisplayNameAttribute;

string displayName = displayNameAttribute != null 
                         ? displayNameAttribute.DisplayName 
                         : property.Name;

答案 1 :(得分:2)

您需要获取DisplayNameAttribute您的财产,然后获取Name

var attribute = property.GetCustomAttribute<DisplayNameAttribute>();

if(attribute != null)
{
   var displayName = attribute.Name;
}