Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MVC.net get enum display name in view without having to refer to enum type in view

I have the following helper method in a ViewModelBase class, which is inherited by other view Models:

public string GetEnumName<T>(Enum value)
        {
            Type enumType = typeof(T);
            var enumValue = Enum.GetName(enumType, value);
            MemberInfo member = enumType.GetMember(enumValue)[0];

            var attrs = member.GetCustomAttributes(typeof(DisplayAttribute), false);
            var outString = ((DisplayAttribute)attrs[0]).Name;

            if (((DisplayAttribute)attrs[0]).ResourceType != null)
            {
                outString = ((DisplayAttribute)attrs[0]).GetName();
            }

            return outString;
        }

I then call this from the view like this:

<p>
@{var rel = Model.GetEnumDisplayName<Enums.wheteverEnum>(Model.wheteverEnum); }
@rel
</p>

Question is - can I work this method so I don't have to tell it the type of the enum? Basically I'd like todo this for all enums:

@Model.GetEnumDisplayName(Model.wheteverEnum)

No typeof, no T, no need to add a reference to the Enums namespace in the View...

Possible?

like image 503
nathfy Avatar asked Sep 09 '25 17:09

nathfy


1 Answers

You can simply remove the type parameter and make it an extension method.

    public static string DisplayName(this Enum value)
    {
        Type enumType = value.GetType();
        var enumValue = Enum.GetName(enumType, value);
        MemberInfo member = enumType.GetMember(enumValue)[0];

        var attrs = member.GetCustomAttributes(typeof(DisplayAttribute), false);
        var outString = ((DisplayAttribute)attrs[0]).Name;

        if (((DisplayAttribute)attrs[0]).ResourceType != null)
        {
            outString = ((DisplayAttribute)attrs[0]).GetName();
        }

        return outString;
    }

    @Model.wheteverEnum.DisplayName()
like image 200
jrummell Avatar answered Sep 13 '25 06:09

jrummell