Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
枚举数组的C#反射_C#_.net_Reflection_Enums - Fatal编程技术网

枚举数组的C#反射

枚举数组的C#反射,c#,.net,reflection,enums,C#,.net,Reflection,Enums,我有一个自定义枚举的类: public enum Capabilities{ PowerSave= 1, PnP =2, Shared=3, } 我的班级 public class Device { .... public Capabilities[] DeviceCapabilities { get { // logic goes here} } 有没有一种方法可以在运行时使用反射来获取此字段的值? 我尝试了以下操作,但得到空引用异常 Proper

我有一个自定义枚举的类:

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);
这可能吗?

这应该可以:

    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);

以下内容应满足您的要求

var property = typeof(Device).GetProperty("DeviceCapabilities");

var deviceCapabilities = (Capabilities[])property.GetValue(device);
请注意,
objectpropertyInfo.GetValue(Object)
方法在.NET4.5中是新的。在以前的版本中,必须为索引添加一个附加参数

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

如果要枚举枚举的所有可能值并作为数组返回,请尝试以下帮助器函数:

public class EnumHelper {
    public static IEnumerable<T> GetValues<T>()
    {
        return Enum.GetValues(typeof(T)).Cast<T>();
    }
}
公共类枚举帮助器{
公共静态IEnumerable GetValues()
{
返回Enum.GetValues(typeof(T)).Cast();
}
}
然后,您可以简单地调用:

Capabilities[] array = EnumHelper.GetValues<Capabilities>();
Capabilities[]array=EnumHelper.GetValues();
如果这不是你想要的,那么我不确定你的意思。

你可以试试这个

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

希望有帮助。

获取此字段的值是什么意思?只需读取该数组并对其声音执行您想要的操作,例如
[Flags]
在这里是合适的:您是否有堆栈跟踪来验证NullReferenceException来自何处?它看起来可能来自DeviceCapabilities属性中的逻辑,或者来自对象中的另一个属性。