Reading the DescriptionAttribute of enumerators and returning the corresponding enum based on the description

by Heathesh 24. May 2010 01:36

There are two things I wanted to achieve using the DescriptionAttribute for my enumerators. The first was to retrieve the description of an enumerator using an extension method, and the second was to return the relevant enumerator based on the description.

To begin with I created a static class I called EnumExtensionManager. I wanted to add my two methods as extension methods so hence the need for the static class. The very first thing I did was apply the description attribute to my enum definitions as follows:

    /// <summary>
    /// Enum of the regions
    /// </summary>
    public enum Region
    {
        [Description("All")]
        AllRegions = 0,
        [Description("Gauteng")]
        Gauteng = 1,
        [Description("Free State")]
        FreeState = 2,
        [Description("Eastern Cape")]
        EasternCape = 3,
        [Description("Western Cape")]
        WesternCape = 4,
        [Description("Mpumalanga")]
        Mpumalanga = 5,
        [Description("Northern Cape")]
        NorthernCape = 6,
        [Description("North West")]
        NorthWest = 7,
        [Description("KwaZulu-Natal")]
        KwaZuluNatal = 8,
        [Description("Limpopo")]
        Limpopo = 9
    }


Now, in order to retrieve the description of the enumerator I created the following static method in my EnumExtensionManager class:

        /// <summary>
        /// Gets the description of an enumerator
        /// </summary>
        /// <param name="enumerator"></param>
        /// <returns></returns>
        public static string GetDescription(this Enum enumerator)
        {
            //get the enumerator type
            Type type = enumerator.GetType();

            //get the member info
            MemberInfo[] memberInfo = type.GetMember(enumerator.ToString());

            //if there is member information
            if (memberInfo != null && memberInfo.Length > 0)
            {
                //we default to the first member info, as it's for the specific enum value
                object[] attributes = memberInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);

                //return the description if it's found
                if (attributes != null && attributes.Length > 0)
                    return ((DescriptionAttribute)attributes[0]).Description;
            }

            //if there's no description, return the string value of the enum
            return enumerator.ToString();
        }


The method will return the description text for an enumerator or return the enumerator name as a string if it can't find the description. Since I created it as an extension method, it was easy enough to call it in code simply by invoking .GetDescription() on any enum value.

            Region regionEnumerator = Region.KwaZuluNatal;
            string regionDescription = regionEnumerator.GetDescription();


Next I wanted to be able to use the description of an enum and return the corresponding enum from it. I achieved this by adding the following extension method to me EnumExtensionManager class:

        /// <summary>
        /// Gets the enumerator from the description passed in
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="description"></param>
        /// <returns></returns>
        public static T GetEnumFromDescription<T>(this string description)
        {
            //get the member info of the enum
            MemberInfo[] memberInfos = typeof(T).GetMembers();

            if (memberInfos != null && memberInfos.Length > 0)
            {
                //loop through the member info classes
                foreach (MemberInfo memberInfo in memberInfos)
                {
                    //get the custom attributes of the member info
                    object[] attributes = memberInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);

                    //if there are attributes
                    if (attributes != null && attributes.Length > 0)
                        //if the description attribute is equal to the description, return the enum
                        if (((DescriptionAttribute)attributes[0]).Description == description)
                            return (T)Enum.Parse(typeof(T), memberInfo.Name);
                }
            }

            //this means the enum was not found from the description, so return the default
            return default(T);
        }


Calling the method was easily done and it could be invoked on any string value like so:

            string regionDescription = "Northern Cape";
            Region regionEnumerator = regionDescription.GetEnumFromDescription<Region>();


That was it. Happy enumerating!

 

Tags: , , , , , ,

Development | .Net

A simple way to read an RSS feed using C#

by Heathesh 10. May 2010 22:26

I found a decent RSS news feed that was free (http://freenewsfeed.newsfactor.com/rss) and was looking at integrating it into my new blog design. In order to do this I wanted to create a simple class that would read an RSS feed based on a URL passed in, and I thought the best way to do this would be to first create a class I could use to store the RSS feed items. So I created the following:

    /// <summary>
    /// RSS feed item entity
    /// </summary>
    public class RssFeedItem
    {
        /// <summary>
        /// Gets or sets the title
        /// </summary>
        public string Title { get; set; }
       
        /// <summary>
        /// Gets or sets the description
        /// </summary>
        public string Description { get; set; }

        /// <summary>
        /// Gets or sets the link
        /// </summary>
        public string Link { get; set; }

        /// <summary>
        /// Gets or sets the item id
        /// </summary>
        public int ItemId { get; set; }

        /// <summary>
        /// Gets or sets the publish date
        /// </summary>
        public DateTime PublishDate { get; set; }

        /// <summary>
        /// Gets or sets the channel id
        /// </summary>
        public int ChannelId { get; set; }
    }


Next I needed a manager class that would read any RSS feed and populate a list of the above rss feed item object with the relevant data. To achieve this I created the following static class:

    /// <summary>
    /// RSS manager to read rss feeds
    /// </summary>
    public static class RssManager
    {
        /// <summary>
        /// Reads the relevant Rss feed and returns a list off RssFeedItems
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        public static List<RssFeedItem> ReadFeed(string url)
        {
            //create a new list of the rss feed items to return
            List<RssFeedItem> rssFeedItems = new List<RssFeedItem>();

            //create an http request which will be used to retrieve the rss feed
            HttpWebRequest rssFeed = (HttpWebRequest)WebRequest.Create(url);

            //use a dataset to retrieve the rss feed
            using (DataSet rssData = new DataSet())
            {
                //read the xml from the stream of the web request
                rssData.ReadXml(rssFeed.GetResponse().GetResponseStream());

                //loop through the rss items in the dataset and populate the list of rss feed items
                foreach (DataRow dataRow in rssData.Tables["item"].Rows)
                {
                    rssFeedItems.Add(new RssFeedItem
                    {
                        ChannelId = Convert.ToInt32(dataRow["channel_Id"]),
                        Description = Convert.ToString(dataRow["description"]),
                        ItemId = Convert.ToInt32(dataRow["item_Id"]),
                        Link = Convert.ToString(dataRow["link"]),
                        PublishDate = Convert.ToDateTime(dataRow["pubDate"]),
                        Title = Convert.ToString(dataRow["title"])
                    });
                }
            }

            //return the rss feed items
            return rssFeedItems;
        }
    }


I was all set, all I had to do now was pass in a URL of an RSS feed, and I would be returned a list of rss feed items...

Happy rss-ing!

Tags: , , ,

Development | .Net | RSS

Powered by BlogEngine.NET 1.5.0.7 (with enhancements by Heathesh)
Theme by Mads Kristensen (with tweeks by Heathesh)

Certifications

Microsoft Certified Professional

Microsoft Certified Technology Specialist

Calendar

<<  September 2010  >>
MoTuWeThFrSaSu
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

View posts in large calendar