获取 class DisplayName 属性值

Get class DisplayName attribute value

我花了最后一个小时试图获取应用于 ClassDisplayName 属性的值。

我发现从方法和属性中获取属性值很简单,但我正在努力处理 class。

谁能帮我解决这个相对较小的问题?

示例如下:

Class

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

变量

var classDisplayName = typeof(T).GetCustomAttributes(typeof(DisplayNameAttribute),true).FirstOrDefault().ToString();

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

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

非常感谢任何帮助!

而不是 ToString 您需要访问 DisplayName 属性。您可以通过转换为 DisplayNameAttribute.

来做到这一点
var classDisplayName =
    ((DisplayNameAttribute)
    typeof(Opportunity)
       .GetCustomAttributes(typeof(DisplayNameAttribute), true)
       .FirstOrDefault()).DisplayName;

试试这个:

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

Console.WriteLine(classDisplayName);

使用您的示例,我可以这样做:

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

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

这输出了"Opportunity".

或者您似乎采用的更通用的方式:

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() returns 和 object[],因此您需要在访问所需的 属性 值之前先应用特定的转换。

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

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 : "";
    }
}

使用它的方法是提供 属性 的名称作为字符串,然后提供 class.

的类型
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 语句将其全部包装起来可能是个好主意,因为它是动态的。

如果你使用

[DisplayName("bla")]

来自

using System.ComponentModel;

然后像这样得到“bla”

string name = ((object)myObject).GetType().GetCustomAttribute<DisplayNameAttribute>()?.DisplayName;

或者您可以使用

[Display(Name = "bla")]

来自

using System.ComponentModel.DataAnnotations;

然后像这样得到“bla”

string name = ((object)myObject).GetType().GetCustomAttribute<DisplayAttribute>()?.GetName();

除非您使用的是动态类型对象,否则不需要强制转换为对象。

所以回答这个问题,我想接下来的代码就可以解决问题了

string name = typeof(T).GetCustomAttribute<DisplayNameAttribute>()?.DisplayName;