Porady: tworzenie klasy C# przy użyciu obiektu CodeModel
Hierarchia obiektu CodeModel2 posiada metody do automatycznego generowania kodu.Chociaż zwykle będziesz wpisywać kod ręcznie, są sytuacje, gdzie możesz chcieć zautomatyzować część procesu.Automatyzacja pozwala na:
Wymuś konwencje nazewnictwa.
Wymuszanie norm dokumentacji.
Utwórz standaryzowane projekty.
Ta procedura zakłada, że wiesz, jak utworzyć projekt dodatek.Aby uzyskać więcej informacji, zobacz Tworzenie dodatków i kreatorów.
Klasa w poniższej procedurze zostanie zawarta w nowym pliku źródłowym.Później metoda jest dodawana do klasy.
[!UWAGA]
Komputer może polazać inne nazwy lub lokalizacje dla niektórych elementów interfejsu użytkownika Visual Studio w dalszych instrukcjach.Te elementy są determinowane przez numer edycji Twojego programu Visual Studio oraz Twoje ustawienia.Aby uzyskać więcej informacji, zobacz Dostosowywanie ustawień środowiska deweloperskiego w Visual Studio.
Aby dodać nowy plik źródłowy do projektu
Utwórz projekt dodatku Visual Studio w Visual C#.
W menu Projekt kliknij polecenie Dodaj odwołanie, kliknij kartę .NET, zaznacz pozycje VSLangProj, VSLangProj2 i VSLangProj80, a następnie kliknij przycisk OK.
Dodaj następujące wywołanie metody do metody OnConnection.
public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom) { _applicationObject = (DTE2)application; _addInInstance = (AddIn)addInInst; // Call the AddClass method. AddAClass(_applicationObject); }
Dodaj metodę AddAClass bezpośrednio poniżej metody OnConnection.
public void AddAClass(DTE2 dte) { }
Dodaj następujący kod do metody AddAClass , aby dodać nowy, pusty plik kodu do projektu.
Szablon CodeFile jest instalowany z Visual Studio i może być lokalizowany za pomocą metody GetProjectItemTemplate.Metoda przyjmuje dwa parametry, szablony języka których szukasz i nazwa pliku dla elementu projektu otrzymywanego w rezultacie.Element projektu jest tworzony za pomocą metody AddFromTemplate.
Kod, proj = soln.Projects.Item(1);, wymaga, aby rozwiązanie Visual C# było otwarte w zintegrowanym środowisku programistycznym (IDE) Visual Studio przed uruchomieniem tego przykładu.
Project proj; String csItemTemplatePath; Solution2 soln; soln = (Solution2)_applicationObject.Solution; // Open a C# solution in the Visual Studio IDE // before running this add-in. proj = soln.Projects.Item(1); ProjectItem pi; csItemTemplatePath = soln.GetProjectItemTemplate("CodeFile", "CSharp"); proj.ProjectItems.AddFromTemplate(csItemTemplatePath, "MyFile.cs"); pi = proj.ProjectItems.Item("MyFile.cs");
Aby dodać przestrzeń nazw do pliku źródłowego
Dodaj następujący kod, aby dodać przestrzeń nazw do pliku źródłowego.
Właściwość FileCodeModel zawiera odwołanie do obiektu FileCodeModel2, który reprezentuje wszystkie elementy kodu w pliku.Obiekt FileCodeModel2 udostępnia kilka metod dodawania elementów kodu do pliku źródłowego.Metoda AddNamespace zwraca obiekt CodeNamespace.Użyjesz tego odwołania CodeNamespace, aby dodać definicję klasy do kodu źródłowego.
FileCodeModel2 fcm = (FileCodeModel2)pi.FileCodeModel; CodeNamespace games;
Aby dodać klasę do przestrzeni nazw
Użyj metody AddClass, aby dodać klasę Chess do przestrzeni nazwy Games .Metoda AddClass zwraca odwołanie do wystąpienia CodeClass, którego można używać do dodawania właściwości oraz metody do klasy.
games = fcm.AddNamespace("Games", -1); CodeClass2 chess;
Aby zdefiniować metodę
Użyj metody AddFunction, aby dodać metodę Move do klasy Chess.Pierwszy argument do metody określa nazwę utworzonego stanowiska.Drugi argument określa typ utworzonych funkcji, ponieważ operatory i konstruktory są również dodawane za pomocą metody AddFunction.Trzeci argument określa zwracany typ funkcji i zostanie zastąpiony dokładnie w podpisie metody.
if (games != null) { // Add a class to the namespace. chess = (CodeClass2)games.AddClass("Chess", -1, null, null, vsCMAccess.vsCMAccessDefault); // Add a method with a parameter to the class. CodeFunction2 move; move = (CodeFunction2)chess.AddFunction("Move", vsCMFunction.vsCMFunctionFunction, "int", -1, vsCMAccess.vsCMAccessDefault, null); move.AddParameter("IsOK", "bool", -1); }
Poniżej przedstawiono plik źródłowy wyprodukowany przez te procedury.
namespace Games { class Chess { int Move(bool IsOK) { return default(int); } } }
Poniżej przedstawiono kod dodatku.
public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom) { _applicationObject = (DTE2)application; _addInInstance = (AddIn)addInInst; // Call the AddClass method. AddAClass(_applicationObject); } public void AddAClass(DTE2 dte) { Project proj; String csItemTemplatePath; Solution2 soln; soln = (Solution2)_applicationObject.Solution; // Open a C# solution in the Visual Studio IDE // before running this add-in. proj = soln.Projects.Item(1); ProjectItem pi; csItemTemplatePath = soln.GetProjectItemTemplate("CodeFile", "CSharp"); proj.ProjectItems.AddFromTemplate(csItemTemplatePath, "MyFile.cs"); pi = proj.ProjectItems.Item("MyFile.cs"); FileCodeModel2 fcm = (FileCodeModel2)pi.FileCodeModel; CodeNamespace games; try { // Add a namespace. games = fcm.AddNamespace("Games", -1); CodeClass2 chess; if (games != null) { // Add a class to the namespace. chess = (CodeClass2)games.AddClass("Chess", -1, null, null, vsCMAccess.vsCMAccessDefault); // Add a method with a parameter to the class. CodeFunction2 move; move = (CodeFunction2)chess.AddFunction("Move", vsCMFunction.vsCMFunctionFunction, "int", -1, vsCMAccess.vsCMAccessDefault, null); move.AddParameter("IsOK", "bool", -1); } } catch (Exception ex) { MessageBox.Show("Failed to add a code model element, because " + ex.Message); } }
Public Sub OnConnection(ByVal application As Object, _ ByVal connectMode As ext_ConnectMode, ByVal addInInst As Object, _ ByRef custom As Array) Implements IDTExtensibility2.OnConnection _applicationObject = CType(application, DTE2) _addInInstance = CType(addInInst, AddIn) AddAClass(_applicationObject) End Sub Public Sub AddAClass(ByVal dte As DTE2) Dim proj As Project Dim csItemTemplatePath As String Dim soln As Solution2 soln = CType(_applicationObject.Solution, Solution2) ' Open a C# solution in the Visual Studio IDE before ' running this add-in. proj = soln.Projects.Item(1) Dim pi As ProjectItem csItemTemplatePath = soln.GetProjectItemTemplate("CodeFile", "CSharp") proj.ProjectItems.AddFromTemplate(csItemTemplatePath, "MyFile34.cs") pi = proj.ProjectItems.Item("MyFile34.cs") Dim fcm As FileCodeModel2 = CType(pi.FileCodeModel, FileCodeModel2) Dim games As CodeNamespace Try ' Add a namespace. games = fcm.AddNamespace("Games") Dim chess As CodeClass2 If Not games Is Nothing Then ' Add a class to the namespace. chess = CType(games.AddClass("Chess"), CodeClass2) ' Add a method with a parameter to the class. Dim move As CodeFunction2 move = CType(chess.AddFunction("Move", vsCMFunction.vsCMFunctionFunction, _ "int"), CodeFunction2) move.AddParameter("IsOK", "bool") End If Catch e As Exception MsgBox("Failed to add a code model element, because " & _ e.ToString()) End Try End Sub
Zastąp kod w klasie OnConnection powyższym przykładowym kodem.Aby dowiedzieć się więcej na temat uruchamiania tego przykładu, zobacz Porady: kontrolowanie dodatków za pomocą menedżera dodatków.
Zobacz też
Zadania
Porady: użycie obiektu CodeModel do analizowania kodu Visual Basic
Koncepcje
Przegląd obiektów CodeModel dla aplikacji Visual Basic i C#