带有枚举数组的c#反射

本文关键字:反射 数组 枚举 | 更新日期: 2023-09-27 17:51:16

我有一个自定义enum类:

public enum Capabilities{
 PowerSave= 1,
 PnP =2,
 Shared=3, }
我班上

public class Device
{
       ....
  public Capabilities[] DeviceCapabilities
  {
     get { // logic goes here}
  }

是否有一种方法使用反射在运行时获得此字段的值?我尝试了以下操作,但得到空引用异常

PropertyInfo[] prs = srcObj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
 foreach (PropertyInfo property in prs)
 {
     if (property.PropertyType.IsArray)
     {
         Array a = (Array)property.GetValue(srcObj, null);
     }    
 }

编辑:感谢您的回答,我真正需要的是一种动态获取值的方法,而无需指定枚举类型。例如:

string enumType = "enumtype"
var property = typeof(Device).GetProperty(enumType);

这可能吗?

带有枚举数组的c#反射

下面应该做你想做的。

var property = typeof(Device).GetProperty("DeviceCapabilities");
var deviceCapabilities = (Capabilities[])property.GetValue(device);

注意Object PropertyInfo.GetValue(Object)是。net 4.5中的新方法。在以前的版本中,您必须为索引添加额外的参数。

var deviceCapabilities = (Capabilities[])property.GetValue(device, null);

应该可以:

    var source = new Device();
    var property = source.GetType().GetProperty("DeviceCapabilities");
    var caps = (Array)property.GetValue(source, null);
    foreach (var cap in caps)
        Console.WriteLine(cap);

如果你想枚举一个Enum的所有可能的值并作为数组返回,那么试试这个辅助函数:

public class EnumHelper {
    public static IEnumerable<T> GetValues<T>()
    {
        return Enum.GetValues(typeof(T)).Cast<T>();
    }
}

你可以简单地调用:

Capabilities[] array = EnumHelper.GetValues<Capabilities>();

如果这不是你想要的,那我就不知道你是什么意思了

你可以试试这个

foreach (PropertyInfo property in prs)
{
    string[] enumValues = Enum.GetNames(property.PropertyType);
}

希望能有所帮助。