2012-05-03 9 views
1

私は別のクラスのメソッドを呼び出す方法を工夫しています。両方のクラスは、実行時に動的に作成されます。私がここで見てきた問題のほとんどは、私が持っているものとは異なる継承に関連しています(私は思います)。動的に作成されたクラス間でメソッドを呼び出そうとしています

私はまだC#をかなり新しくしており、いくつかの概念をテストしようとしています。

public class CustomPanel : Panel 
{ 
    List<Control> _myControls = new List<Control>; 
    // _myControls[0] += new EventHandler(myFunc); 

    public void myFunc(object sender, EventArgs e) 
    { 
     // parentClass.recordFunc(); 
    } 
} 

私の目的は、データベースの呼び出しから、実行時にレコードを作成することです:

public class Record 
{ 
    CustomPanel _panel; 

    public void recordFunc(){} 
} 

内部的に作成したクラスは、このような何かを持っています

最初のクラスは、このようなものです。この時点で、FlowLayoutControlに追加されるPanel(私のCustomPanelクラスから)が作成されます。パネルの内部コントロールからイベントが発生すると、親レコードクラスの一部を更新する必要があります。

ご協力いただきまして誠にありがとうございます。

+5

説明: "両方のクラスは実行時に作成されます。" ILエミッタを使用して新しい*クラス*を動的にコンパイルしていることを意味しますか、単にこのタイプのオブジェクトの新しい*インスタンス*を作成していますか? – StriplingWarrior

+0

私は正しいことを言いませんでした。実行時に新しいクラスを作成するのではなく、実行時に新しいインスタンスを作成しています。それはこの小さなプロジェクトに必要なものよりも多くの仕事になるでしょう。 –

答えて

0

私はあなたが求めているものを100%わからないんだけど、あなたが実行時にクラス型を知らないとき、クラスに関数を呼び出す方法を知りたいようだが、それ1つまたは複数のレコードタイプにすることができます。あれは正しいですか?

もしそうなら、派生型にインターフェイスを実装して、インターフェイスメソッドを呼び出すことです。たとえば、あなたが複数の「レコード」のクラスを持っているし、次を試してみてください、実行時に種類がわからない場合:それはあなたが探しているものはない場合

public interface IRecord 
{ 
    void RecordFunc(); 
} 

public class ARecord : IRecord 
{ 
    public void RecordFunc() 
    { 
     Console.WriteLine("ARecord.RecordFunc"); 
    } 
} 

public class AnotherRecord : IRecord 
{ 
    public void RecordFunc() 
    { 
     Console.WriteLine("AnotherRecord.RecordFunc"); 
    } 
} 

public class CustomPanel : Panel 
{  
    private IRecord _parentRecord; 

    // Where parentRecord could be ARecord or AnotherRecord 
    public class CustomPanel(IRecord parentRecord) 
    { 
     _parentRecord = parentRecord; 
    } 

    public void MyFunc(object sender, EventArgs e) 
    { 
     _parentRecord.RecordFunc(); 
    } 
} 

、明確にしてください。

+0

それはまた良い考えです。明らかに、複数のレコードタイプがロードされているのではなく、プログラム実行中にフローレイアウトコントロールにイベントハンドラを追加すると、イベントハンドラをパネルに動的に配置する必要があります。各コントロールは親レコードオブジェクトを更新できる必要があります。レコードオブジェクトのスコープへのアクセスが容易になるため、これを別の方法で配置して、レコードをCustomPanelオブジェクトの子にすることができます。私はそうすることで、良いコーディングの実践に違反していると感じています。 –

+0

私は100%確実ではありませんが、各コントロールがレコードを表している場合は、コントロールをレコード1:1に必ず関連付け、このレコードのデータを「提示」します。あなたの親コントロールに子どものコレクションを持ち、両者の間でコミュニケーションを取ることには何も問題ありません。あなたが.NETでメモリリークを作成することができない他のものをunsubするためにイベントのサブクイングを開始する場合は、ちょっと注意してください。 –

0

RecordインスタンスにCustomPanelが含まれているからといって、CustomPanelの中から利用可能なクラスの魔法のインスタンスはありません。このような関係を自分で設定する必要があります。例えば。

public class Record 
{ 
    CustomPanel _panel; 
    public CustomPanel panel 
    { 
     get { return _panel; } 
     set { _panel = value; _panel.parent = this; } 
    } 

    public void recordFunc(){} 
} 

public class CustomPanel : Panel 
{ 
    public Record parent { get; set; } 

    public void myFunc(object sender, EventArgs e) 
    { 
     parent.recordFunc(); 
    } 
} 
+0

情報ありがとう!私は、C#がそのようなきれいな小さなツールで満たされているので、利用可能な魔法のインスタンスがあることを望んでいました。 –

関連する問題