我花了最后一个小时尝试获取应用于
DisplayName
的 Class
属性的值。
我发现从方法和属性中获取属性值很简单,但我在这个类上遇到了困难。
有人可以帮我解决这个相对较小的问题吗?
示例如下:
班级
[DisplayName("Opportunity")]
public class Opportunity
{
// Code Omitted
}
变量
var classDisplayName = typeof(T).GetCustomAttributes(typeof(DisplayNameAttribute),true).FirstOrDefault().ToString();
我在 MSDN 等上花了很多时间,但我想我错过了一些愚蠢简单的东西。
无论怎样,这对未来的读者来说也是一个很好的问题
非常感谢任何帮助!
使用你的例子,我可以做到这一点:
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[]
,因此您需要先应用特定的转换,然后才能访问所需的属性值。
您需要访问
ToString
属性,而不是 DisplayName
。您可以通过投射到 DisplayNameAttribute
来做到这一点。
var classDisplayName =
((DisplayNameAttribute)
typeof(Opportunity)
.GetCustomAttributes(typeof(DisplayNameAttribute), true)
.FirstOrDefault()).DisplayName;
一些有效的解决方案已经存在,但您也可以创建如下扩展方法:
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 语句将其全部包装起来可能是个好主意。
试试这个:
var classDisplayName = ((DisplayNameAttribute)typeof(Opportunity).GetCustomAttributes(typeof(DisplayNameAttribute), true).FirstOrDefault()).DisplayName;
Console.WriteLine(classDisplayName);