Search code examples
c#enumspropertyinfo

How to tell if a PropertyInfo is of a particular enum type?


I have the following code:

public class DataReader<T> where T : class
{
    public T getEntityFromReader(IDataReader reader, IDictionary<string, string> FieldMappings)
    {
        T entity = Activator.CreateInstance<T>();
        Type entityType = entity.GetType();
        PropertyInfo[] pi = entityType.GetProperties();
        string FieldName;

        while (reader.Read())
        {
            for (int t = 0; t < reader.FieldCount; t++)
            {
                foreach (PropertyInfo property in pi)
                {
                    FieldMappings.TryGetValue(property.Name, out FieldName);

                    Type genericType = property.PropertyType;

                    if (!String.IsNullOrEmpty(FieldName))
                        property.SetValue(entity, reader[FieldName], null);
                }
            }
        }

        return entity;
    }
}

When I get to a field of type Enum, or in this case NameSpace.MyEnum, I want to do something special. I can't simply SetValue because the value coming from the database is let's say "m" and the value in the Enum is "Mr". So I need to call another method. I know! Legacy systems right?

So how do I determine when a PropertyInfo item is of a particular enumeration type?

So in the above code I'd like to first check whether the PropertyInfo type is of a specif enum and if it is then call my method and if not then simply allow SetValue to run.


Solution

  • static void DoWork()
    {
        var myclass = typeof(MyClass);
        var pi = myclass.GetProperty("Enum");
        var type = pi.PropertyType;
    
        /* as itowlson points out you could just do ...
            var isMyEnum = type == typeof(MyEnum) 
            ... becasue Enums can not be inherited
        */
        var isMyEnum = type.IsAssignableFrom(typeof(MyEnum)); // true
    }
    public enum MyEnum { A, B, C, D }
    public class MyClass
    {
        public MyEnum Enum { get; set; }
    }