I have EF model class. for that I created MetadataType for that partial class.

Now I need to read or get all of these displayname of the properties of the object from c#. So I can use the in Excel Header row.

[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;

Here I want get all properties displayname in iteration. So I can add them to excel Header row and cells. How to do that?

3

Best Answer


Reflection and LINQ is your friend

typeof(vwGridMetadata).GetProperties().Select(x => x.GetCustomAttribute<DisplayAttribute>()).Where(x => x != null).Select(x => x.Name);

Note: You need to include System.Reflection and System.Linq namespaces to your project in order to use these methods.

ASP.Net Core 2 :

 var listOfFieldNames = typeof(vwGridMetadata).GetProperties().Select(f => f.GetCustomAttribute<DisplayAttribute>()).Where(x => x != null).Select(x=>x.Name).ToList();

Just do this:

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;}

You can make a foreach to loop through vwGridMetadata class properties and call this method on each property, or just make a foreach inside and remove the Object argument from the method.