だらだらやるよ。

こげつのIT技術メモ

VisualStudioのアドインからクラスを生成

http://d.hatena.ne.jp/nagakura_eil/20080420/1208628908
の続き。今日は作ったクラスにメソッドを追加してみました。


まずは前回追加したTestClassのFileCodeModelのインスタンスを取得します。

FileCodeModel2 fcm = (FileCodeModel2)dir.ProjectItems.Item("TestClass.cs").FileCodeModel;

この中身は、usingやnamespace、クラス定義が入れ子になっているので、クラスを探して取得する必要があります。
本来ならオブジェクトの中身を一つずつチェックしてやる必要があるのですが
とりあえず今回はクイックウォッチで覗き見しちゃいました。

CodeClass cls = (CodeClass)fcm.CodeElements.Item(5).Children.Item(1);

これでクラスを取得することができました。
ここからはさらにメソッド等の追加をしていきます。それぞれのクラスやメソッドの詳細はMSDN
http://msdn2.microsoft.com/ja-jp/library/envdte.codeclass(VS.80).aspx

CodeFunction f = cls.AddFunction("TestFunc",vsCMFunction.vsCMFunctionFunction,vsCMTypeRef.vsCMTypeRefBool,0,vsCMAccess.vsCMAccessPublic,0);
f.AddParameter("testprm1",vsCMTypeRef.vsCMTypeRefInt,0);
f.AddParameter("testprm2",vsCMTypeRef.vsCMTypeRefString,0);

で、肝心のメソッドの中身を書きます。

TextPoint tps = f.StartPoint;
EditPoint ep = tps.CreateEditPoint();
ep.EndOfLine();
ep.Insert("\n");
ep.Insert("string t1 = \"abcdefg\";\n");
ep.Insert("string t2 = \"abcdefg\";\n");

こんな感じでごりごり書く必要があります。

で、ここまで書いて思ったのだけど、どうせメソッドの中身を全部書く必要があるのだから
クラス定義取得したところで、全部削除して文字列で書いたほうがすっきりするかなぁとか:-)
んー、でもとりあえずここまできたら作りたいものを決めてからかな
あとメンテナンスをどれだけするかによってもかわりそうだし。


一応クラスをまるっと書き直すサンプル乗せておきます。

CodeElement cls = fcm.CodeElements.Item(5).Children.Item(1);
EditPoint clsEp = cls.StartPoint.CreateEditPoint();
clsEp.Delete(cls.EndPoint);
clsEp.Insert(@"
public class Test{
	int _hoge = 0;
	public Test(int hoge){
		_hoge = hoge;
	}
	public void ShowHogeMessageBox(){
		System.Windows.Forms.MessageBox.Show(_hoge.ToString());
	}
}");