我有一个自定义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);
这可能吗?
下面应该做你想做的。
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);
}
希望能有所帮助。