我有一个简单的枚举类型
public enum TestEnum
{
TestOne = 3,
TestTwo = 4
}
var testing = TestEnum.TestOne;
我希望通过反射获取它的值(3)。有什么想法吗?
我有一个简单的枚举类型
public enum TestEnum
{
TestOne = 3,
TestTwo = 4
}
var testing = TestEnum.TestOne;
我希望通过反射获取它的值(3)。有什么想法吗?
非常好的问题Mat。
问题的情景如下:
你有一些未知的枚举类型和该类型的一些未知值,你想获取该未知值的底层数字值。
这是使用反射进行的一行代码方式:
object underlyingValue = Convert.ChangeType(value, Enum.GetUnderlyingType(value.GetType()));
TestEnum.TestTwo
,那么value.GetType()
将等于typeof(TestEnum)
,Enum.GetUnderlyingType(value.GetType())
将等于typeof(int)
,而值将是3(装箱;有关装箱和拆箱值的更多详细信息,请参见http://msdn.microsoft.com/en-us/library/yz2be5wk.aspx)。您可以使用System.Enum帮助程序:
System.Type enumType = typeof(TestEnum);
System.Type enumUnderlyingType = System.Enum.GetUnderlyingType(enumType);
System.Array enumValues = System.Enum.GetValues(enumType);
for (int i=0; i < enumValues.Length; i++)
{
// Retrieve the value of the ith enum item.
object value = enumValues.GetValue(i);
// Convert the value to its underlying type (int, byte, long, ...)
object underlyingValue = System.Convert.ChangeType(value, enumUnderlyingType);
System.Console.WriteLine(underlyingValue);
}
输出
3
4
完整的代码: 如何在 C# 中使用反射获取枚举值
MemberInfo[] memberInfos =
typeof(MyEnum).GetMembers(BindingFlags.Public | BindingFlags.Static);
string alerta = "";
for (int i = 0; i < memberInfos.Length; i++) {
alerta += memberInfos[i].Name + " - ";
alerta += memberInfos[i].GetType().Name + "\n";
}
如果您在反射上下文中加载了一个程序集,则GetValue和GetValues方法不起作用。但是我们可以采用另一种方法:
var val = typeof(MyEnum).GetFields()
.Where(fi => fi.IsLiteral && fi.Name == "TestOne")
.Select(fi => fi.GetRawConstantValue())
.First();
为什么需要使用反射?
int value = (int)TestEnum.TestOne;
namespace.TestEnum
,只有这个 "namespace.TestEnum"
,该怎么办? - T.S.Type.GetType(yourString)
来获取 System.Type
。 - Daniel A. White根据您的要求,这很简单,就像其他人已经指出的那样。只需将枚举对象转换为整数,您就可以获得枚举的数字值。
int value = (int) TestEnum.TestOne;
var value = TestEnum.TestOne | TestEnum.TestTwo;
var all_options_dic = typeof(TestEnum).GetEnumValues().Cast<object>().ToDictionary(k=>k.ToString(), v=>(int) v);
将字典过滤,仅返回混合选项。
var filtered = all_options_dic.Where(x => (x.Value & (int) options) != 0).ToDictionary(k=>k.Key, v=>v.Value);
使用您的选项执行任何逻辑,例如打印它们、将它们转换为列表等等。:
foreach (var key in filtered.Keys)
{
Console.WriteLine(key + " = " + filtered[key]);
}
System.Array enumValues = System.Enum.GetValues(typeof(MyEnum));
Type underlyingType = System.Enum.GetUnderlyingType(MyEnum);
foreach (object enumValue in enumValues)
System.Console.WriteLine(String.Format("{0}",Convert.ChangeType(enumValue ,underlyingType)));
protected static object PropertyValue(object obj, string propertyName)
{
var property = obj.GetType().GetProperty(propertyName);
if(property == null)
throw new Exception($"{propertyName} not found on {obj.GetType().FullName}");
if (property.PropertyType.IsEnum)
return (int) property.GetValue(obj);
return property.GetValue(obj);
}
Enum.Parse(enumType, enumvalue).GetHashCode();
private static Type GetEnumType(string enumName)
{
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
{
var type = assembly.GetType(enumName);
if (type == null)
continue;
if (type.IsEnum)
return type;
}
return null;
}
Enum.GetValues(enumType);
我希望它能帮助到某个人!
(保留HTML)或者,如果你需要实际的枚举对象(类型为TestEnum):
MemberInfo[] memberInfos = typeof(MyEnum).GetMembers(BindingFlags.Public | BindingFlags.Static);
string alerta = "";
for (int i = 0; i < memberInfos.Length; i++) {
alerta += memberInfos[i].Name + " - ";
/* alerta += memberInfos[i].GetType().Name + "\n"; */
// the actual enum object (of type MyEnum, above code is of type System.Reflection.RuntimeFieldInfo)
object enumValue = memberInfos[i].GetValue(0);
alerta += enumValue.ToString() + "\n";
}
TestEnum.TestOne
的情况下,您已经拥有值3
。那么您实际上拥有什么? - AakashM