我有EF模型类。为此,我为该部分类创建了MetadataType
。
现在我需要从c#中读取或获取对象属性的所有这些displayname。所以我可以使用Excel Excel标题行。
[MetadataType(typeof(vwGridMetadata))]
public partial class vwGrid
{
}
public class vwGridMetadata
{
[Display(Name = "Note ID")]
public int intNoteID { get; set; }
[Display(Name = "Global Number")]
public string strGlobalLoanNumber { get; set; }
[Display(Name = "Data Source ID")]
public Nullable<int> intDataSourceID { get; set; }
[Display(Name = "Sample ID")]
....
}
vwGrid grd = new vwGrid;
这里我想在迭代中获取所有属性displayname。所以我可以将它们添加到excel Header行和单元格中。怎么做?
答案 0 :(得分:12)
Reflection
和LINQ
是你的朋友
typeof(vwGridMetadata)
.GetProperties()
.Select(x => x.GetCustomAttribute<DisplayAttribute>())
.Where(x => x != null)
.Select(x => x.Name);
注意:您需要在项目中加入System.Reflection
和System.Linq
命名空间才能使用这些方法。
答案 1 :(得分:1)
ASP.Net Core 2:
var listOfFieldNames = typeof(vwGridMetadata)
.GetProperties()
.Select(f => f.GetCustomAttribute<DisplayAttribute>())
.Where(x => x != null)
.Select(x=>x.Name)
.ToList();
答案 2 :(得分:0)
只需执行以下操作:
private string GetDisplayName(vwGridMetadata data, Object vwGridMetadataPropertie)
{
string displayName = string.Empty;
string propertyName = vwGridMetadataPropertie.GetType().Name;
CustomAttributeData displayAttribute = data.GetType().GetProperty(propertyName).CustomAttributes.FirstOrDefault(x => x.AttributeType.Name == "DisplayAttribute");
if (displayAttribute != null)
{
displayName = displayAttribute.NamedArguments.FirstOrDefault().TypedValue.Value;
}
return displayName;
}
您可以创建一个foreach来遍历vwGridMetadata类的属性并在每个属性上调用此方法,或者只在内部进行一个foreach并从该方法中删除Object参数。
答案 3 :(得分:-3)
[必填] [Display(Name =“ Usuario1”,AutoGenerateFilter = false)] [StringLength(10,ErrorMessage =“纵向的El {0}实体{1}和{2}。”,MinimumLength = 6)] 公共字符串Usuario {get;组; }