J'ai un Enum simple
public enum TestEnum
{
TestOne = 3,
TestTwo = 4
}
var testing = TestEnum.TestOne;
Et je veux récupérer sa valeur (3) par réflexion. auriez vous des idées pour faire ça?
Grande question Mat.
Le scénario de la question est le suivant:
Vous avez un type d'énumération inconnu et certains valeur inconnue de ce type et vous voulez obtenir la valeur numérique sous-jacente de cette valeur inconnue.
Voici la façon de procéder en ligne en utilisant la réflexion:
object underlyingValue = Convert.ChangeType(value, Enum.GetUnderlyingType(value.GetType()));
Si la valeur se trouve être TestEnum.TestTwo
, Alors value.GetType()
serait égal à typeof(TestEnum)
, Enum.GetUnderlyingType(value.GetType())
serait égal à typeof(int)
et la valeur serait 3 (encadré; voir http://msdn.Microsoft.com/en-us/library/yz2be5wk.aspx pour plus de détails sur les valeurs de boxing et unboxing).
Pourquoi aurait-on jamais besoin d'écrire un tel code? Dans mon cas, j'ai une routine qui copie les valeurs d'un modèle de vue dans un modèle. J'utilise cela dans tous mes gestionnaires dans un projet ASP.NET MVC dans le cadre d'une architecture très propre et élégante pour écrire des gestionnaires qui n'ont pas les problèmes de sécurité que rencontrent les gestionnaires générés par les modèles Microsoft.
Le modèle est généré par Entity Framework à partir de la base de données et contient un champ de type int. Le viewmodel a un champ d'un type enum, appelons-le RecordStatus, que j'ai défini ailleurs dans mon projet. J'ai décidé de soutenir pleinement les énumérations dans mon cadre. Mais maintenant, il existe un décalage entre le type de champ dans le modèle et le type de champ correspondant dans le modèle de vue. Mon code le détecte et convertit l'énumération en entier en utilisant le code similaire à celui à une ligne indiqué ci-dessus.
Vous pouvez utiliser les assistants 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);
}
Les sorties
3
4
Code complet: Comment obtenir des valeurs d'énumération avec réflexion en 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";
}
Pourquoi avez-vous besoin de réflexion?
int value = (int)TestEnum.TestOne;
Pour votre besoin, c'est aussi simple que les gens l'ont déjà souligné. Il suffit de transtyper l'objet enum en int et vous obtiendrez la valeur numérique de l'énumération.
int value = (int) TestEnum.TestOne;
Cependant, s'il est nécessaire de mélanger les valeurs d'énumération avec | (OR au niveau du bit), par ex.
var value = TestEnum.TestOne | TestEnum.TestTwo;
et vous souhaitez obtenir les options que représente la valeur mixte, voici comment vous pouvez le faire (remarque: ceci est pour les énumérations représentées par des valeurs int destinées à tirer parti des opérations au niveau du bit):
tout d'abord, obtenez les options enum ainsi que leurs valeurs dans un dictionnaire.
var all_options_dic = typeof(TestEnum).GetEnumValues().Cast<object>().ToDictionary(k=>k.ToString(), v=>(int) v);
Filtrez le dictionnaire pour ne renvoyer que les options mixtes.
var filtered = all_options_dic.Where(x => (x.Value & (int) options) != 0).ToDictionary(k=>k.Key, v=>v.Value);
faites n'importe quelle logique avec vos options. par exemple. les imprimer, les transformer en List, etc.:
foreach (var key in filtered.Keys)
{
Console.WriteLine(key + " = " + filtered[key]);
}
j'espère que cela t'aides.
Essayez ce qui suit:
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)));
Pas besoin de réflexion:
int value = (int)TestEnum.TestOne;
Salut, vous avez cette alternative:
Type typevar = GetType([YourEnum])
Et puis ... ... Vous pouvez obtenir des noms en utilisant typevar.GetEnumNames
renvoyant un tableau avec des noms et pour obtenir des valeurs en utilisant type.GetEnumValues
, renvoyant un tableau avec des valeurs.
Dans mon cas, le problème était que MyEnum n'a pas été trouvé en raison d'un signe + obtenant le type de l'assembly (ligne 2):
var dll = System.Reflection.Assembly.LoadFile("pathToDll");
Type myEnum = dll.GetType("namespace+MyEnum");
System.Array myEnumValues = System.Enum.GetValues(myEnum);
C'est simple.
var value = propertyInfo.GetValue(obj); // this return TestOne or TestTwo
var enumValue = Convert.ChangeType(value, typeof(int)); // this return 3 or 4