获取类DisplayName属性值

时间:2015-10-07 14:34:41

标签: c# reflection

我花了最后一小时试图获取应用于DisplayName的{​​{1}}属性的值。

我发现从方法和属性中获取属性值非常简单,但我正在努力解决这个问题。

任何人都可以帮我解决这个相对较小的问题吗?

以下示例:

班级

Class

变量

 [DisplayName("Opportunity")]
 public class Opportunity
 {
  // Code Omitted
 }

我花了很多时间在MSDN和SO上,但我想我错过了一些简单的东西。

对于未来的读者来说也是一个很好的问题

任何帮助都非常感谢!

4 个答案:

答案 0 :(得分:6)

使用你的例子我得到了它的工作:

 var displayName = typeof(Opportunity)
    .GetCustomAttributes(typeof(DisplayNameAttribute), true)
    .FirstOrDefault() as DisplayNameAttribute;

if (displayName != null)
    Console.WriteLine(displayName.DisplayName);

这输出了“机会”。

或者你似乎更通用的方式:

public static string GetDisplayName<T>()
{
    var displayName = typeof(T)
      .GetCustomAttributes(typeof(DisplayNameAttribute), true)
      .FirstOrDefault() as DisplayNameAttribute;

    if (displayName != null)
        return displayName.DisplayName;

     return "";
}

用法:

string displayName = GetDisplayName<Opportunity>();

GetCustomAttributes()会返回object[],因此您需要在访问所需的属性值之前先应用特定的强制转换。

答案 1 :(得分:1)

您需要访问ToString属性而不是DisplayName。您可以通过转换为DisplayNameAttribute来完成此操作。

var classDisplayName =
    ((DisplayNameAttribute)
    typeof(Opportunity)
       .GetCustomAttributes(typeof(DisplayNameAttribute), true)
       .FirstOrDefault()).DisplayName;

答案 2 :(得分:0)

试试这个:

var classDisplayName = ((DisplayNameAttribute)typeof(Opportunity).GetCustomAttributes(typeof(DisplayNameAttribute), true).FirstOrDefault()).DisplayName;

Console.WriteLine(classDisplayName);

答案 3 :(得分:0)

已经存在一些有效的解决方案,但您也可以创建这样的扩展方法:

using System.ComponentModel.DataAnnotations;
using System.Reflection;


public static class PropertyExtension
{
    public static string GetDisplayName<T>(this string property)
    {
        MemberInfo propertyInfo = typeof(T).GetProperty(property);
        var displayAttribute = propertyInfo?.GetCustomAttribute(typeof(DisplayAttribute)) as DisplayAttribute;

        return displayAttribute != null ? displayAttribute.Name : "";
    }
}

使用它的方法是将属性的名称作为字符串提供,然后提供类的类型。

var propertyNameInClass = "DateCreated"; // Could be any property
// You could probably do something like nameof(myOpportunity.DateCreated)
// to keep it strongly-typed
var displayName = propertyNameInClass.GetDisplayName<Opportunity>();
if(!string.IsNullOrEmpty(displayName))
{
    // Do something
}

我认为这比其他一些解决方案更具动态性和清洁性。用try / catch语句包装它可能是一个好主意,因为它具有动态特性。