2013-01-09 88 views
2

C#反思我有自定义枚举类:与枚举阵列

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

这可能吗?

+0

你是什么意思'获得这个领域的价值'?简单地阅读该数组,然后按照你的意愿做 –

+1

这里适合使用'[Flags]'的声音:http://msdn.microsoft.com/en-us/library/system.flagsattribute.aspx –

+0

你有堆栈吗?跟踪来验证NullReferenceException来自哪里?它看起来可能来自您的DeviceCapabilities属性中的逻辑,或来自对象中的另一个属性。 –

回答

0

这应该工作:

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

以下应该做你的愿望。

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

如果要列举一个枚举的所有可能的值,并返回一个数组,然后尝试这个辅助功能:

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

然后,您只需拨打:

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

如果那不是你以后的话,我不确定你的意思。

0

你可以试试这个

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

希望它能帮助。