获取类DisplayName属性值

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

我花了最后一个小时尝试获取应用于

DisplayName
Class
属性的值。

我发现从方法和属性中获取属性值很简单,但我在这个类上遇到了困难。

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

示例如下:

班级

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

变量

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

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

无论怎样,这对未来的读者来说也是一个很好的问题

非常感谢任何帮助!

c# reflection
4个回答
13
投票

使用你的例子,我可以做到这一点:

 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[]
,因此您需要先应用特定的转换,然后才能访问所需的属性值。


3
投票

您需要访问

ToString
属性,而不是
DisplayName
。您可以通过投射到
DisplayNameAttribute
来做到这一点。

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

2
投票

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

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 语句将其全部包装起来可能是个好主意。


0
投票

试试这个:

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

Console.WriteLine(classDisplayName);
© www.soinside.com 2019 - 2024. All rights reserved.