反思以及如何处理枚举

时间:2013-01-27 14:57:25

标签: c# reflection enums

我想使用类似的东西:

object ob;
            var props = ob.GetType().GetProperties();

            List<Element> list = new List<Element>();
            foreach (var prop in props)
            {
                if (prop.PropertyType == typeof(String))
                    list.Add(makeStringProperty(prop));
                else if (prop.PropertyType == typeof(int))
                    list.Add(makeIntProperty(prop));
                else
                {
                }
            }

为给定对象中的每个属性添加一些给定列表。现在我想添加一个子句来添加枚举变量,包括通过Enum.GetValues()f.e获取它的所有值。 对于任何给定枚举都很容易,但我希望这对于每个可能的枚举都是通用的, 例如,如果ob有:

enum Weather {
sunny,
rainy,
cloudy
}
Weather weather = sunny;

enum Places {
beach,
mall,
home
}
Places place = beach;

我可以自己获取两个变量和两个枚举的所有值。 当然我不能直接检查typeof(Enum)或其他什么。 有人有线索吗?

2 个答案:

答案 0 :(得分:1)

else if(prop.PropertyType.IsEnum)
{
    var values = Enum.GetValues(prop.PropertyType);
}

答案 1 :(得分:0)

就像

typeof(Weather).GetFields()

ob.GetType().GetFields()

如果您想直接在enum类型上使用反射。 enum的成员是static个字段。

但你也可以使用

Enum.GetValues(ob.GetType())

在任何情况下,如果有疑问,你应该先检查它是否是枚举:

var typeOfOb = ob.GetType();
if (typeOfOb.IsEnum)
{
  // use Enum.GetValues(typeOfOb) here
}

注意:System.Type是用于类型确定编译时的类,如typeof(Weather),以及类型确定的运行时,如ob.GetType()。因此,您可以将它们用作GetValues(System.Type)静态方法的参数。