我花了最后一小时试图获取应用于DisplayName
的{{1}}属性的值。
我发现从方法和属性中获取属性值非常简单,但我正在努力解决这个问题。
任何人都可以帮我解决这个相对较小的问题吗?
以下示例:
班级
Class
变量
[DisplayName("Opportunity")]
public class Opportunity
{
// Code Omitted
}
我花了很多时间在MSDN和SO上,但我想我错过了一些简单的东西。
对于未来的读者来说也是一个很好的问题
任何帮助都非常感谢!
答案 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语句包装它可能是一个好主意,因为它具有动态特性。