获取 class DisplayName 属性值
Get class DisplayName attribute value
我花了最后一个小时试图获取应用于 Class
的 DisplayName
属性的值。
我发现从方法和属性中获取属性值很简单,但我正在努力处理 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;
我花了最后一个小时试图获取应用于 Class
的 DisplayName
属性的值。
我发现从方法和属性中获取属性值很简单,但我正在努力处理 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;