2016-06-29 5 views
0

Iは、コード行を有する:C番号:同じ機能を列挙するための文字列と非列挙変換

obj.Properties.ToList().ForEach(p => parameters.Add(Convert.ChangeType(p, ctor.GetParameters()[parameters.Count].ParameterType))); 

obj.Propertiesは、文字列配列(string[])であり、そしてparametersオブジェクト(List<object>)のリストであります。私は、私のコンストラクタ(ctor)を選択したクラスの新しいインスタンスを作成したいと思います。これは、配列obj.Propertiesの多くの文字列と同じ数のパラメータを持ちます。

コンストラクタを呼び出すには、コンストラクタが必要とする型に文字列をキャストする必要があります(上記のtryを参照してください)。これはintboolで動作しますが、コンストラクタもenumのパラメータを持ち、コードが列挙型に変換しようとするとInvalidCastExceptionとなります。

Enum.Parseが代わりに提案されているSOF answerを読んでいますが、これは1行で行います(enumかどうかに依存しません)。

public static T MyConvert<T>(String value) 
{ 
    if (typeof(T).IsEnum) 
    return (T)Enum.Parse(typeof(T), value); 

    return (T)Convert.ChangeType(value, typeof(T)); 
} 

そして:だから私は、リンクされた答えのソリューションを使用

obj.Properties.ToList().ForEach(p => parameters.Add(MyConvert< ctor.GetParameters()[parameters.Count].ParameterType>(p))); 

をしかし、私はエラーを得た:Operator '<' cannot be applied to operands of type 'method group' and 'Type'

私も

Type type = ctor.GetParameters()[parameters.Count].ParameterType; 
obj.Properties.ToList().ForEach(p => parameters.Add(MyConvert<type>(p))); 

しかし、私を試してみました得られた:'type' is a variable but is used like a type

これは実用的なソリューションです:

obj.Properties.ToList().ForEach(p => 
{ 
    if (ctor.GetParameters()[parameters.Count].ParameterType.IsEnum) 
    { 
     parameters.Add(Enum.Parse(ctor.GetParameters()[parameters.Count].ParameterType, p)); 
    } 
    else 
    { 
     parameters.Add(Convert.ChangeType(p, ctor.GetParameters()[parameters.Count].ParameterType)); 
    } 
}); 

しかし、列挙型と非列挙型のために同じコードを使用する方法はありますか?ですから、ForEachにif(...IsEnum)のないソリューションを探しています。

+0

はあなたがコンストラクタを呼び出す方法を示しすることはできますか? –

+0

@MatteoUmili ctor.Invoke(parameters.ToArray()) – szkup

答えて

0

私は解決策を見つけました。つまり、コンパイル時ではなく、実行時に正確な型が十分であることを知るために、MyConvert関数を非汎用にしました。

public static object MyConvert(String value, Type T) 
{ 
    if (T.IsEnum) 
     return Enum.Parse(T, value, true); 

    return Convert.ChangeType(value, T); 
} 

そして:

obj.Properties.ToList().ForEach(p => parameters.Add(Parse(p, ctor.GetParameters()[parameters.Count].ParameterType)));