2012-11-14 24 views
7

Tôi muốn lập trình thêm hàm (một TestMethod) vào C# -file hiện có. Sau một số googling tôi đã tìm thấy thư viện EnvDTECodeModel.AddFunction -Phương pháp, nhưng tôi không thể tìm thấy một ví dụ hay về những gì tôi muốn.Thêm chức năng lập trình vào C# -file hiện tại với EnvDTE

Tôi muốn thêm hàm có mã đã có trong hàm mới được tạo và cũng có thuộc tính. Một cái gì đó như thế này:

/// <summary> 
/// Documentation 
/// </summary> 
[TestMethod] 
public void TestMethod1() 
{ 
    string test = Helper.CodeExample(); 
} 

Bất cứ ai có thể cho tôi xem ví dụ về cách thực hiện việc này không?

EDIT: Tôi muốn chỉnh sửa tệp C#, như bạn sẽ chỉnh sửa tệp văn bản. Tôi biết bạn có thể làm điều này với một StreamWriter, nhưng có thể có một cách tốt hơn để làm điều này?

+0

Bạn có nghĩa là sửa đổi một C# (văn bản) tập tin hoặc C# (.NET) lớp học? Sửa đổi văn bản hoàn toàn khác với sửa đổi mã đã biên dịch. – larsmoa

+0

Tôi có nghĩa là tệp văn bản C#. Đó là để tạo ra các tập tin thử nghiệm. Tôi có thể làm điều này với một StreamWriter, nhưng tôi mặc dù có lẽ là một cách tốt hơn để làm điều này. – Mathieu

+0

Bạn cần phải tìm một thứ có thể phân tích mã thành một cây cú pháp, sau đó điều chỉnh cây cú pháp đó để thêm hàm của bạn và sau đó tạo một tệp mới từ cây cú pháp đó. –

Trả lời

5

EnvDTE có thể là con đường để đi. Bạn có thể phát triển một VisualStudio Add-In và sau đó sửa đổi phương thức Exec. Trong phương thức này, bạn phải lấy tài liệu đang hoạt động và ProjectItem của nó. Đây là nơi bạn tìm thấy CodeModel chứa rất nhiều CodeElements. Trong số các phần tử này bạn phải tìm CodeNamespace, và bên trong phần tử này là CodeClass. Đây là đối tượng đáp ứng với hàm AddFunction trả về CodeFunction mới mà bạn có thể thêm thuộc tính và mã của bạn (đây là một phần mà tôi không thích quá nhiều, vì bạn phải sử dụng EditPoint).

Đây là một phiên bản rất đơn giản của Exec mà bạn có thể sử dụng như là một điểm khởi đầu:

public void Exec(string commandName, vsCommandExecOption executeOption, ref object varIn, ref object varOut, ref bool handled) 
    { 
     handled = false; 
     if(executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault) 
     { 
      handled = true; 
      if (commandName == "TestAddMethod.Connect.TestAddMethod") 
      { 
       Document activeDoc = _applicationObject.ActiveDocument; 
       if (activeDoc == null) 
        return; 
       ProjectItem prjItem = activeDoc.ProjectItem; 
       if (prjItem == null) 
        return; 
       FileCodeModel fcm = prjItem.FileCodeModel; 
       if (fcm == null) 
        return; 

       CodeElements ces = fcm.CodeElements; 
       // look for the namespace in the active document 
       CodeNamespace cns = null; 
       foreach (CodeElement ce in ces) 
       { 
        if (ce.Kind == vsCMElement.vsCMElementNamespace) 
        { 
         cns = ce as CodeNamespace; 
         break; 
        } 
       } 
       if (cns == null) 
        return; 
       ces = cns.Members; 
       if (ces == null) 
        return; 
       // look for the first class 
       CodeClass cls = null; 
       foreach (CodeElement ce in ces) 
       { 
        if (ce.Kind == vsCMElement.vsCMElementClass) 
        { 
         cls = ce as CodeClass; 
         break; 
        } 
       } 
       if (cls == null) 
        return; 
       CodeFunction cf = cls.AddFunction("TestMethod1", vsCMFunction.vsCMFunctionFunction, vsCMTypeRef.vsCMTypeRefVoid, -1, vsCMAccess.vsCMAccessPrivate); 
       cf.AddAttribute("TestMethod", "true"); 
       TextPoint tp = cf.GetStartPoint(vsCMPart.vsCMPartBody); 
       EditPoint ep = tp.CreateEditPoint(); 
       ep.Indent(); 
       ep.Indent(); 
       ep.Indent(); 
       ep.Insert("string test = Helper.CodeExample();"); 
      } 
     } 
    } 
+0

Đây là những gì tôi đang tìm kiếm! Đây là cách tốt hơn là chỉ chỉnh sửa tệp cs như một tệp văn bản. Cảm ơn rất nhiều! – Mathieu

+1

Đây là một điểm khởi đầu tuyệt vời cho tôi! Cảm ơn bạn! Cũng đáng chú ý là có thể làm 'SmartFormat' hơn là thụt lề. Nó thông minh định dạng một loạt các mã bắt đầu từ việc gọi 'EditPoint' và kết thúc tại tham số' TextPoint'. Dưới đây là ví dụ sử dụng mã ở trên: 'ep.Insert (" string test = Helper.CodeExample(); ");' 'tp.CreateEditPoint(). SmartFormat (ep);' – philt5252

Các vấn đề liên quan