2012-04-21 3 views
2

実行時に値の型がわかっているだけの場合、オブジェクト[]をdouble []などの値型に変換できますか? .net組込み変換を使用してobject []内のオブジェクトをvalue要素型(doubleなど)に変換できない場合、例外は完全に許容されます。実行時にオブジェクト[]をValueType []に​​変換しようとしました

var original = new object[] { 1 , 2 , 3 , 4 , 5 , 6 } 
Type resultType = typeof(double[]); // or any means of getting a type at runtime 
var result = ?? 

次の試みは失敗している:

# error: Object must impliment IConvertible 
Convert.ChangeType(original , resultType); 

# error: Object cannot be stored in an array of this type. 
var result = Array.CreateInstance(resultType , original.Length); 
for (int i = 0 ; i < original.Length ; i++) 
{ 
    result.SetValue(Convert.ChangeType(original[ i ] , resultType.GetElementType()) , i); 
} 
+0

本当に、二重配列を作成し、各オブジェクトを二重にしてインデックスに設定するだけではどうですか?シンプルなループ?オブジェクトの不正な配列を処理するために "if(obj is double){...}"を追加できます。 – SimpleVar

+0

resultTypeはdouble型であることは保証されていません。実行時に決定されます。これは任意の値型にすることができます。 – SFun28

+0

一般的なキャスト拡張の​​方法を使用しないのはなぜですか? ValueTypesに制約する場合は、Castメソッドを使用する独自のCastメソッドを作成できますが、 "!typeof(T).IsValueType"の場合はスローします。私の答えを見てください。 – SimpleVar

答えて

3

あなたの最後の試みは非常に近かった:Array.CreateInstanceは、その最初のパラメータとして要素型がかかるため、最初の行は

var result = Array.CreateInstance(resultType.GetElementType(), original.Length); 

する必要があります。それ以外は完全に動作するはずです。

+0

もちろん!金曜日の夜のコード==悪い。 =) – SFun28

0
private T[] Cast<T>(params object[] items) 
{ 
    if (!typeof(T).IsValueType) 
    { 
     throw new ArgumentException("Destined type must be Value Type"); 
    } 

    return items.Cast<T>().ToArray(); 
} 
+0

upvoted downvoteをキャンセルします。オペレーションはそれほど明確ではありませんでしたが、コード・コメントでは、タイプ・オブジェクトは実行時にのみ使用可能であると述べています。 – nawfal

関連する問題