2016-09-06 1 views
1

J'essaie de désérialiser les types enum.Comment puis-je créer un IEnumerable à partir d'une énumération en utilisant son System.Type

je besoin d'une méthode avec ce prototype:

private static object CSVConvertParam(string value, System.Type t); 

Je peux donc l'utiliser de cette façon:

enum MyEnum { val1=0, val2=1, val3=2 ...} 
... 
System.Type enumType = typeof(MyEnum); 
... 
var unserializedVal = CSVConvertParam("val3", enumType); 

J'ai lu cette question à peu près semblable: How can I create an IEnumerable from an enum

Mais mon cas, le type est inconnu à la compilation.

Il doit être très proche de celle-ci:

private static object CSVConvertParam(string value, System.Type t) 
{ 
int enumIndex = ((IEnumerable<????>) t.GetEnumValues()).ToList().IndexOf(value); 
return (Enum)Enum.ToObject(t, enumIndex); 

} 

sauf que je aurais besoin de connaître le type de béton qui représente t avoir la (IEnumerable) Caste au travail.

Existe-t-il un moyen de résoudre ce problème?

EDIT: J'ai essayé de faire une version générique qui résoudrait ce problème:

private static object CSVConvertParam<T>(string value) 
{ 
    if (typeof(T).IsEnum) 
     { 
     int enumIndex = ((IEnumerable<T>) typeof(T).GetEnumValues()).ToList().IndexOf(value); // this actually does not work and needs to be worked on 
      return (Enum)Enum.ToObject(t, enumIndex); 
     } 
} 

Mais en supposant que je parviens à faire que cette méthode fonctionne correctement, le compilateur ne semble pas me permettre de invoquer comme je veux dire:

string[] propertiesNames = ...; 
    PropertyInfo propertyInfo = properties.FirstOrDefault(p => p.Name.Equals(propertiesNames[i])); 
    paramValue = CSVConvertParam<propertyInfo.PropertyType>(objectPropertiesValues[i]); 
compilateur

n'accepte pas CSVConvertParam: « type ou espace de noms PropertyInfo ne peuvent pas être trouvé ... » Je suppose que encore une fois, propertyInfo.PropertyType est un systè m.Type tandis que <> attend un type concret.

+7

Pourquoi ne pas utiliser '' Enum.Parse' ou Enum.TryParse'? – juharr

+1

D'accord. La signature de cette méthode est la même que ['Enum.Parse'] (https://msdn.microsoft.com/fr-fr/library/essfb559 (v = vs.110) .aspx), juste avec les paramètres inversés . –

+0

parce que Enum.TryParse aurait besoin que je connaisse le type concret. Enum.TryParse (valeur, résultat) fonctionnerait. Mais je ne sais pas quel est le type au moment de la compilation. Je n'ai que typeof (MyEnum). Je ne sais pas comment revenir de mon paramètre de méthode contenant typeof (T) au type T. –

Répondre

0

Essayez Enum.GetNames(type). Cela renvoie un string[] puis vous pouvez trouver l'index de votre chaîne dans ce tableau.

Mais, comme d'autres l'ont dit, vous êtes probablement réinventer Enum.Parse(Type, string)