2016-09-06 10 views
1

列挙型を直列化しようとしています。System.Typeを使用して列挙型からIEnumerableを作成する方法

私はこのプロトタイプを持つメソッドが必要になります。 How can I create an IEnumerable from an enum

しかし、中:私はこのほぼ同様の質問を読んでいる

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

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

は、だから私はそれをこのように使用することができますコンパイル時に型が不明です。

それはこの非常に接近していなければならない:

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

} 

私はtは(IEnumerableを)が動作するようにキャスト持つことを表す具体的なタイプを知っておく必要があるだろうということを除いて。

これを解決する方法はありますか?

EDIT: 私はこの問題を解決する一般的なバージョンを作ってみました:

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

しかし、その後、コンパイラは私がすることができていないようです、私はこの方法が正しく動作するようにするために管理することを想定し私が意味するとして、それを呼び出す:「propertyInfoが見つからない型または名前空間...」 私は再び、propertyInfo.PropertyTypeがSysteであることとします

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

コンパイラはCSVConvertParamを受け付けません<>は具体的なタイプを想定しています。

+7

'Enum.Parse'または' Enum.TryParse'を使用しないのはなぜ? – juharr

+1

合意。このメソッドのシグネチャは、[Enum.Parse'](https://msdn.microsoft.com/en-us/library/essfb559(v = vs.110).aspx)と同じように見えますが、パラメータが逆になっているだけです。 Enum.TryParseは具体的な型を知っている必要があるので、 –

+0

です。 Enum.TryParse (値、出力結果)が機能します。 コンパイル時にタイプが何であるか分かりません。 私はtypeof(MyEnum)しか持っていません。 typeof(T)を含むメソッドパラメータをT型に戻す方法がわかりません。 –

答えて

0

お試しEnum.GetNames(type)。これはstring[]を返します。その配列内の文字列のインデックスを見つけることができます。

しかし、他の人が言ってきたように、あなたはおそらくちょうど再発明していEnum.Parse(Type, string)

関連する問題