2011-06-27 4 views
1

私は以前のプロジェクトのデータファイルを編集できる小さなアプリケーションを作ろうとしています。私はそのプロジェクトにアクセスすることができます "データクラス"(主な目的は、(パブリック)メンバ変数を公開することです)は、ファイルを読み書きすることができます。私がしなければならないことは、各データクラスが持っているさまざまなメンバ変数を編集できるGUIを作ることです(できればデータクラスを変更することはできません)。そして、これをどうやって適応させるのかを理解しようとしています将来の変更/追加。 (私は、すべてのメンバー変数を編集可能にする必要があるとは思いません。GUI生成のためのデータの表現方法(クラス)

すべてのデータは文字列(数値とテキスト)に変換できますが、テキストボックスやGUIのDataGridViewなどの生成にはそれほど問題はありませんが、私はそれらを生成するために必要なデータを表現したいと思います。

私の最初の考えは、各データクラスにすべての変数を含むリストを使用することでした。リストの各行に変数の名前+説明(GUIの場合)、データクラスの変数へのポインタ、おそらくはさまざまな変数の検証機能のある形式が含まれています。 このリストは元のデータクラスを継承するクラスに格納されます(そして、特定のGUI関連関数(ロード/保存など)のためのインタフェース/抽象クラスを実装します)。

私がこの解決策を心配するのは、これがやや一般的な問題であるべきだと感じていて、OOになると少し錆びます。この解決策は、もし私がCでそれをやらなければならなかった。

便利な言語構成、デザインパターンなどがあるかもしれないが、私は何を検索するのか分からない。

このアプローチは賢明に見えますか?

答えて

0

この場合、あなたの友人はあなたの友です。あなたのデータクラスはそのクラスのTypeを使って調べることができる構造を持っています。 Typeは、クラスまたは構造に関するメタデータの基本クラスであり、たとえば、そのクラスに属するすべてのフィールド、プロパティ、および/またはメソッドのリストを取得するメソッドを含みます。これらのクラス「メンバ」を表すオブジェクトは、その型のオブジェクトのインスタンスが与えられたときに、フィールド値またはプロパティ値を設定または取得したり、メソッドを呼び出すために使用できます。

反射アルゴリズムは、与えられたオブジェクト構造を処理するように設計でき、静的型に基づくアルゴリズムとは異なり、コンパイル時にそれらの構造を知る必要はありません。欠点は?遅いですし、アルゴリズムのコンパイル時のチェックがほとんどなくなるため、実行時に予期しない方法で失敗する可能性があります。ここで

はあなたが始めるために何か:

//statically set up an instance of some arbitrary object 
MyClass myObject = new MyClass(); 
myObject.Field1 = "Hello"; 
myObject.Field2 = "World"; 

//This method is available on any object, and produces a Type representing the class definition 
Type myType = myObject.GetType(); 

//C# also has a typeof() keyword that works when you have a static type and not an instance 
myType = typeof(MyObject); 

//Interrogate the Type instance to get its fields 
FieldInfo[] fields = myType.GetFields(); 

//then, iterate through the fields to perform some (useful?) work. 
//Here, we are outputting a list of paired field names and their current values. 
//You will probably want to instantiate a Label and Textbox representing this value 
//and show them on a Form. 
foreach(FieldInfo field in fields) 
    Console.WriteLine(String.Format("{0}: {1}", field.Name, field.GetValue(myObject)); 

編集可能性を処理するために、ユーザーが変更する権限と彼らがないを持っているかの記録のいくつかの並べ替えが必要になります。その情報がユーザーからユーザーに変わることがない場合は、属性を使用してその情報をデータクラス自体に組み込むことができます(オブジェクトの「インターフェース」は変わりません。追加のメタデータを持ちます)。親クラスの "フィールドアクセス権"のセットとしてそれぞれを定義するインタフェースを実装する別のクラスセットを作成し、オブジェクトを表すTypeインスタンスを使用して動的に "フィールド許可"クラスのインスタンスを構築することもできますフィールド権限オブジェクトが実装するインターフェイスの名前の定義、知識、および定義。

関連する問題