2009年8月31日月曜日

クラスのインスタンスを動的に作成する。

Delphi2010と同じ動きをするDelphi Prismのソースです。

まずは、実行用のフォームの処理です。

  1. namespace WindowsApplication1;  
  2.   
  3. interface  
  4.   
  5. uses  
  6.   System.Drawing,  
  7.   System.Collections,  
  8.   System.Collections.Generic,  
  9.   System.Linq,  
  10.   System.Windows.Forms,  
  11.   System.ComponentModel,  
  12.   System.Reflection,  
  13.   SakaTestSpace;  
  14.   
  15. type  
  16.   /// <summary>  
  17.   /// Summary description for MainForm.  
  18.   /// </summary>  
  19.   MainForm = partial class(System.Windows.Forms.Form)  
  20.   private  
  21.     method button1_Click(sender: System.Object; e: System.EventArgs);  
  22.   protected  
  23.     method Dispose(disposing: Boolean); override;  
  24.   public  
  25.     constructor;  
  26.   end;  
  27.   
  28.   
  29.   
  30. implementation  
  31.   
  32.   
  33. {$REGION Construction and Disposition}  
  34. constructor MainForm;  
  35. begin  
  36.   //  
  37.   // Required for Windows Form Designer support  
  38.   //  
  39.   InitializeComponent();  
  40.   
  41.   //  
  42.   // TODO: Add any constructor code after InitializeComponent call  
  43.   //  
  44. end;  
  45.   
  46. method MainForm.Dispose(disposing: Boolean);  
  47. begin  
  48.   if disposing then begin  
  49.     if assigned(components) then  
  50.       components.Dispose();  
  51.   
  52.     //  
  53.     // TODO: Add custom disposition code here  
  54.     //  
  55.   end;  
  56.   inherited Dispose(disposing);  
  57. end;  
  58. {$ENDREGION}  
  59.   
  60. method MainForm.button1_Click(sender: System.Object; e: System.EventArgs);  
  61. var  
  62.   SakaTestIntf : SakaTestSpace.ISakaTest;  
  63.   CreateClassName : String;  
  64.   t : System.Type;  
  65.   obj : System.Object;  
  66.   Assem  : System.Reflection.Assembly;  
  67.   
  68. begin  
  69.   
  70.   //使用するアセンブリをロードする  
  71.   Assem := System.Reflection.Assembly.Load('ClassLibrary1');  
  72.   
  73.   t := Assem.GetType('SakaTestSpace.' + textBox1.Text);  
  74.   
  75.   obj := Activator.CreateInstance(t);  
  76.   
  77.   if obj <> nil then  
  78.   begin  
  79.     SakaTestIntf := (obj As  SakaTestSpace.ISakaTest);  
  80.     if SakaTestIntf <> nil then  
  81.     begin  
  82.       label3.Text := SakaTestIntf.SayMessage();  
  83.     end;  
  84.   end;  
  85. end;  
  86.   
  87. end.  


次に検証に使ったクラスです。

  1. namespace SakaTestSpace;  
  2.   
  3. interface  
  4.   
  5. uses  
  6.   System.Collections.Generic,  
  7.   System.Linq,  
  8.   System.Text;  
  9.   
  10. type  
  11.   ISakaTest = public interface  
  12.     method SayMessage : String;  
  13.   end;  
  14.   
  15. type  
  16.   TSakaTest = public class(ISakaTest)  
  17.   private  
  18.   protected  
  19.   public  
  20.     method SayMessage : String ; virtual;  
  21.   end;  
  22.   
  23.   TSakaTest1 = public class(TSakaTest)  
  24.   private  
  25.   protected  
  26.   public  
  27.     method SayMessage : String; override;  
  28.   end;  
  29.   
  30.   TSakaTest2 = public class(TSakaTest)  
  31.   private  
  32.   protected  
  33.   public  
  34.     method SayMessage : String; override;  
  35.   end;  
  36.   
  37.    
  38. implementation  
  39.   
  40. method TSakaTest.SayMessage : String;  
  41. begin  
  42.   Result := "";  
  43. end;  
  44.   
  45. method TSakaTest1.SayMessage : String;  
  46. begin  
  47.   Result := 'Delphi Prism First Message';  
  48. end;  
  49.   
  50. method TSakaTest2.SayMessage : String;  
  51. begin  
  52.   Result := 'Delphi Prism Second Message';  
  53. end;  
  54.   
  55. end.  


PrismのほうがActivatorクラスが使える分、楽だ(短い処理で実現可能)と思う

0 件のコメント: