2012-01-18 3 views
1

私は厳密に個人学習のためにC#のORMを書いています。私は列名がクラスのプロパティと一致するデータベースをループしています。私はその後、クラスのプロパティをループし、対応するデータベースの列値を割り当てるが、私は問題のデータベース列からの戻り値をキャストに実行しています。Reflectionを使ってORMを書くことは正しくキャストできません

var PropCollection = type.GetProperties(); 
foreach (PropertyInfo Property in PropCollection) 
{ 
    Property.SetValue(_t, DReader[Property.Name].ToString(),null); 
} 

私が予想されるエラーを取得:DReaderはちょうどSqlDataReaderのは、ループの内側に列の値を返している

Object of type 'System.String' cannot be converted to type 'System.Int32'.

を、私はそのようにキャストしないか、この値はint型であると言いますか? ?

Property.GetType(); 

は正しく、私は必要なタイプを知っているが、どのように私はDReader[Property.Name]をキャストするためにそれを使用していますか?

+0

ORMの "規則"に応じて、 '.ToString()'を削除することができますが、 'SetValue'を使用しているので、実際にキャストする必要はありません。 ? –

答えて

5

Convert.ChangeTypeは、すべての直線変換を処理できます。

ループにはDReader[Property.Name].ToString()を使用しないでください。 ToString()を削除します。

var PropCollection = type.GetProperties(); 
foreach (PropertyInfo Property in PropCollection) 
{ 
    var value = DReader[Property.Name]; 
    if (!Property.GetType().IsAssignableFrom(value.GetType()) 
     value = Convert.ChangeType(value, Property.GetType()); 

    Property.SetValue(_t, value, null); 
} 
+0

ありがとう、何とかConvertは私のC#ボキャブラリーから完全に欠けていました! – Jordan