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を参照してください)。これはint
とbool
で動作しますが、コンストラクタも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)
のないソリューションを探しています。
はあなたがコンストラクタを呼び出す方法を示しすることはできますか? –
@MatteoUmili ctor.Invoke(parameters.ToArray()) – szkup