2011-07-11 41 views
0

我想要做的事情可能看起來像一個奇怪的場景。請記住,我需要爲Demo項目執行此操作,在該項目中,我向用戶輸出c#代碼,以教他們如何編寫某些控件。在C#中,從文本文件輸出代碼時排除類的好方法

我給了一個.cs文件,我需要輸出內容。文件中至少有一個類,最多...很多。我需要輸出整個文件,除了一種類型。我想防止輸出的類的具體類型都繼承了某個基類,所以它們應該很容易區分。

下面是一個例子:

public abstract class A{} 

    public class B{] 

    public class C{} 

假定這些是基本類型的我的一些類可以繼承。我想阻止輸出從A繼承的所有類。A可能是唯一的抽象基類,所以如果這樣可以幫助的話,那將是非常棒的。

比方說,我給一個文件,example.cs:

using System; 
    using OtherStuff; 

    namespace blah.blahagain.someotherblah 
    { 
     [AttributeOne] 
     [AttributeTwo] 
     [AttributeThree] 
     public class AA: A 
     { 
     //stuff 
     } 

     public class BB: B 
     { 
     //stuff 
     } 

     public class CC: C 
     { 
     //stuff 
     } 

     public class D 
     { 
     //stuff 
     } 

    } 

和輸出應該是

using System; 
    using OtherStuff; 

    namespace blah.blahagain.someotherblah 
    { 
     public class BB: B 
     { 
     //stuff 
     } 

     public class CC: C 
     { 
     //stuff 
     } 

     public class D 
     { 
     //stuff 
     } 

    } 

我想到的唯一方法是蠻力的字符串操作。但是,我不能將空格用作類之間的分隔符,因爲不能保證類之間是否存在空格。我需要跟蹤打開和關閉的花括號,以發現一個類開始和另一個結束的位置。我還需要通過在第一個{}對之前測試字符串標記來測試每個類的基類。

另外我還需要防止輸出AA的屬性。

因爲這裏有許多更明亮的頭腦,我在這裏問是否有另一個更簡單/更清潔的方法來做我所需要的。

感謝您的閱讀!

在YetAnotherUser的回答後編輯:輸出應該與包含所有註釋的文件完全相同。

另一種編輯:與其回答某些軟件或庫可以做到這一點,我更喜歡算法。也許正則表達式?我對他們不太好,所以我不知道他們可以用來做什麼。

+0

對代碼文件格式有任何保證嗎?比如所有匹配的{和}大括號都處於同一級別?即。你能找到「public class」的縮進,然後跳到匹配的},或者你可能冒險有類似你的第一個代碼示例中的類,即。一切都在一條線上? –

+0

編碼指南有關於縮進的規範,但不能保證文件將被正確縮進(人們懶惰) – Yuf

+0

爲什麼你需要輸出第二個文件?你想在這裏解決哪個問題? –

回答

4

你能包你需要排除一切:

#region ExcludeRegion 
    [AttributeOne] 
    [AttributeTwo] 
    [AttributeThree] 
    public class AA: A 
    { 
    //stuff 
    } 
#endregion 

#region documentation

這應該是比較容易掃描和排除。它還爲您提供顯示隱藏在IDE中的內容的額外好處。

+1

聽起來好像OP對輸入文件沒有太多的控制。 – FishBasketGordo

+0

人們隨意添加更多文件到項目中。這是一個內部幫助器產品,所有開發人員都可以訪問。如果我必須要求所有人包裝它,我認爲這會很不方便。我已經重新設計了這個項目,以減少對必須完成的工作的依賴。而且作爲一個fyi,我們已經在代碼中使用了區域。 – Yuf

+0

如果這是唯一的解決方案,那麼我可以嘗試。但是這是一種折衷:更少的工作發現隱藏什麼,併爲編碼文件的開發人員提供更多的工作。但我寧願在幕後做更多的工作,也不願依靠文件本身。 – Yuf

0

更新:顯然沒有支持解析的CodeDomProvider實現。因此,這是無效的 - 我會繼續這篇文章,以確保這突出顯示有人思考相同的路線。


可以使用 CodeDomProvider解析代碼,然後取下所需的類並重新生成代碼文件。

如果是出於教育目的,這可能不完全符合您的需要,因爲生成的文件可能與原始源文件不完全匹配。

見 -

  1. System.CodeDom Namespace
  2. Using the CodeDOM
  3. Microsoft .NET CodeDom Technology - Part 1
+1

麻煩的是,CSharpCodeProvider顯然不支持Parse方法http://stackoverflow.com/questions/3631909/an-alternative-for-csharpcodeprovider-parse – AlexD

+0

@AlexD - 偉大的捕獲,從未使用它,但總是認爲它。我會試試看,並更新我的答案。 – YetAnotherUser

+0

我編輯了我的帖子,添加了我需要保留評論。我通過鏈接閱讀,似乎可以使用它來重新生成它保存在CodeCompileUnit中的代碼,但我不確定它是否也會保存註釋。 – Yuf

1

您可以嘗試使用開源的lib NRefactory。它支持將代碼解析爲AST,然後您可以修改它並生成輸出代碼。它也可以保留你的評論,如他們的wiki頁面所示。

在這裏找到它:An alternative for "CSharpCodeProvider.Parse"

+0

這是第三方庫嗎?問題在於Demo將附加到將要發貨的實際產品上。儘管Demo不應該在發佈版本中出現,但我們仍然嘗試不使用第三方代碼。不過謝謝您的幫助。 – Yuf

+0

雖然我可以編寫自己的解析器,但它與您的建議類似,可以追溯到我原來的字符串處理想法。 – Yuf

+0

是的,不幸的是它是第三方庫。 – AlexD

相關問題