2011-10-19 7 views
0

メソッド内でクラスを渡すことができるかどうか誰かが知っていますか?C#=メソッドのクラス変数を渡します。

「ツリーからフォレストを見ることができない」タイプのものである可能性があるため、この問題をより良く解決/アプローチする方法について、いくつかの洞察を提供することもできます。

は基本的に、私はハンドリングだオブジェクト(人、車両、場所やアイテム)の種類を持っていると私は、ユーザーが/編集/ /ビューを追加

これらのオブジェクトを削除させたいです。これをサポートするために、オブジェクトのリストから特定のオブジェクトを選択するためのフォーム(「オブジェクトタイプ」をフォームとフォームに渡します)を作成しました(これは「ObjecctSelectフォーム」と呼ばれます)ユーザーが選択できるこれらのオブジェクトのリスト(車のようなもの)を作成することを知っています。ユーザーがオブジェクトを選択すると、ObjectSelectフォームは別のフォームを呼び出します(これは、AEVD_Vehicleフォーム、AEVDロケーションフォームなどのオブジェクトタイプによって異なります)。これにより、ユーザーは追加/編集/表示/削除できるようになります選択されたオブジェクト

オブジェクトが「よく定義されている」ときに実際にはうまくいきますが、今ではいくつかの「カスタム」オブジェクトの必要性があり、追加/編集/表示/削除のカスタムを渡すことができると期待していましたオブジェクト "フォームを" ObjectSelect "フォームに追加します。私はクラスのインスタンスを渡すことができます(クラス自体ではありません)が、実際にはオブジェクトが選択されるまではコンストラクタ情報を持っていません...または、ユーザーが追加、編集、表示するかどうかを選択したかどうかまたは選択したオブジェクトを削除します。

私はフォームに渡すことができるもう一つの理由は、私が開発しているいくつかのアプリケーションで使用されているライブラリに "objectSelect"フォームを置いたことです。私たちが扱っているプラ​​ットフォームによっては、 "AddEditDelete Object form"が別のメーカーライブラリを参照する必要があり、これらの製造元ライブラリをすべて "ライブラリ"リファレンスにしたくない場合があります。 ...プラスこれらのメーカーは物事を別々に扱います。たとえば、追加/編集/表示/削除フォームには、バーコードスキャンと写真撮影が含まれています。製造元によっては、別の製造元ではもう一方を実行する前にオフにしなければなりません。 。

これは意味がありますか?それとも、私はこれを処理する必要がある別の/より良い方法はありますか?

+0

擬似コードで必要なものを要約できますか? –

答えて

0

私はこのような問題に近づくのは、あなたが特定のタイプでやりたいと思っているすべてのことを考えているところです。これまでリストに載っていたものから、それぞれのタイプのように思えます。データを取得する方法と、関連するフォームを持つアイテムを編集する方法があります。だから、それが意味をなさないように思えるのは、すべての実装を特定の型に置き換えて、それをある種の共通の構造体に入れ、その構造体を使って作業を行うことです。基本的なアイデアを与える必要がありますいずれにせよ、

public interface IEditorForm 
{ 
    void SetItemToEdit(object item); 
    object GetModifiedItem(); 
} 

public class DataModifierFactory 
{ 
    public Func<IEnumerable<object>> GetData { get; set; } 
    public Func<IEditorForm> EditorFormFactory { get; set; } 
} 

//in your code, set up how the types will get handled 
//keep this registration of types and editor info on ObjectSelect form 
Dictionary<Type,DataModifierFactory> myModifiers = new Dictionary<Type,DataModifierFactory>(); 

Func<IEnumerable<object>> intDataSource =()=>{ return new int[] { 0,1,2,3 }; }; 
Func<IEditorForm> intEditorFormFactory =()=>new IntEditorForm(); 
myModifiers.Add(typeof(int), new DataModifierFactory(){GetData=intDataSource,EditorFormFactory=intEditorFormFactory}; 

Func<IEnumerable<object>> stringDataSource =()=>{ return new string[] { "A","B","C" }; }; 
Func<IEditorForm> stringDataFormFactory =()=>new StringEditorForm(); 
myModifiers.Add(typeof(string), new DataModifierFactory(){GetData=stringDataSource,EditorFormFactory=stringDataFormFactor}; 


//On object select form 
//this variable is set from above 
Dictionary<Type,DataModifierFactory> m_DataModifierFactoryRegistry; 
IEditorForm m_ItemEditorForm; 

public void ModifyDataOfType<T>() 
{ 
    DataModifierFactory factory = m_DataModifierFactoryRegistry[typeof(T)]; 
    myListOfData.Source = factory.GetData(); 
    m_ItemEditorForm = factory.EditorFormFactory(); 
} 

public void OnSelectedItemChanged(object newItem) 
{ 
    object oldItem = m_ItemEditorForm.GetModifiedItem(); 
    //save the old item, etc. Possibly another item on DataModiferFactory 
    //then set up for the next 
    m_ItemEditorForm.SetItemToEdit(newItem); 
} 

:たとえば

、オブジェクトの我々の2つのタイプではなく、車両のint型や文字列であると仮定し、など は、その後、あなたはこのような何かを行うことができます。 Funcを使用するのではなく、確かにインターフェイスなどのファクトリを持つことができます。WPFではアイテムエディタフォームなどのオブジェクトの代わりにジェネリックを使用しようとしていますが、シナリオの複雑さはわかりません。

これで問題は解決しますか?

関連する問題