0

Relectionを使用してクラスプロパティを設定するために、次のコードを使用しています

MyClasss c = new MyClass(id);
prop = c.GetType().GetProperty(field);
prop.SetValue(c, Convert.ChangeType(value, prop.PropertyType), null);

値は DataGridView から取得され、CellEndEdit イベントによってトリガーされるため、ユーザーが入力する値は、多数のプロパティと型のいずれかになります。

Convert.ChangeType が正常に機能する場合もありますが、Invalid Cast エラーが発生する場合もあります。

たとえば、プロパティの型が (decimal?) [nullable decimal] の場合、エラーが発生します。

[編集]

私がやっていることのもう少しの背景として、DataGridView には、ユーザーが SQL サーバーのデータに対して行った最近の変更に関する情報が含まれています。変更のリストが含まれており、テーブル、フィールド、新しい値、および古い値と、誰がいつ変更を行ったかの詳細が表示されます。マネージャーが変更の 1 つに同意しない場合は、元に戻すオプションがあります。そのため、リストの項目が選択されたら、コードで適切なテーブルとフィールドを検索し、現在の値を保存されている oldvalue に戻す必要があります。これは、クライアントが特に DataGrid として望んでいた監査制御機能です。

問題は、データグリッドに表示されるフィールドの数が原因で、データのタイプが何でもあり、実行時までわからないことです。正直なところ、これらの状況で DataBinding を使用する方法はわかりませんが、Reflection よりも優れたオプションであると誰かがまだ信じている場合は、おそらく正しい方向に向けてください。

4

1 に答える 1

2

valueによって受け入れられる型のは、Convert.ChangeType実装する必要がありますIConvertible。任意の型を変換していることは明らかです。それらはインターフェイスを実装していないため、無効なキャスト例外が発生します。

参照: Convert.ChangeType

于 2013-11-13T06:48:31.107 に答える