2009-10-30 19 views
0

有沒有什麼方法可以在運行時讀取asp.net導入指令?我有一個ExpressionBuilder,它傳遞了許多類名。現在我有充分qulify這些名字,但如果我能夠從內部的ExpressionBuilder閱讀的命名空間,我能救自己很多typeing的...在運行時閱讀asp.net頁面導入指令

<%@ Import namespace="MyNameSpace.Data.Library" %> 

// //

string GetNamespace() 
{ 
    return Page.blablabla(); // MyNameSpace.Data.Library 
} 

更多信息:

我正在使用System.Web.BuildManager.GetType()來獲取我的對象的類型。什麼時候(或可以)以某種方式引用Import指令?

+0

你能列出你喂這些類名的地方嗎?另外,如果沒有完全合格的課程名稱,您如何確定它們是獨一無二的?多一點這方面的信息會有所幫助。 – 2009-11-08 16:02:06

+0

我在「支持」庫中有一些類,我需要從表達式生成器讀取屬性值。主要查找我在DAL庫中公開的數據綁定的最大長度值。我無法確定它們是否獨一無二,但如果需要,我很樂意處理這個問題。我所引用的一些庫名稱非常長。這可能是另一個問題,但不確定我是否能夠控制這些名稱。使用完全限定名稱會導致標記名稱很長。我希望通過導入指令提供一些命名空間來減少它們。 – andleer 2009-11-09 17:37:22

+0

可能會補充一點,微軟似乎正在用他們的一些數據源控件來做這件事。你可以在LinqDataSource中指定你的數據上下文的類名。我正在使用BuildManager來實現我的類的實例,並希望以某種方式獲得對名稱空間的訪問權限,否則BuildManager會爲我執行此操作。不知怎的,MS正在這樣做。 – andleer 2009-11-09 17:39:46

回答

2

經過研究的主題,我不認爲這是可以做到的。如果頁面沒有明確或隱式地導入命名空間(通過web.config),則必須完全限定您的控件。

另外,我認爲命名空間不是一個類的「屬性」。我相信編譯器會在編譯時使用它們進行檢查,然後在編譯時實際完全限定控件/類。換句話說,編譯後的代碼沒有明確的「使用或導入」語句列表進行評估。

2

如果您註冊在Web.confignamespaces section的命名空間,而不是與<%@ Import %>語句,可以比較容易地閱讀程序是這樣的:

PagesSection pages = (PagesSection) 
    ConfigurationManager.GetSection("system.web/pages"); 

foreach (NamespaceInfo nsInfo in pages.Namespaces) 
{ 
    string ns = nsInfo.Namespace; 
    Response.Write(String.Format("<p>{0}</p>", ns)); 
} 

如果這是不是一種選擇,它應該是比較容易用一些正則表達式來穿過.aspx文件的標記。

+0

我有權訪問Page對象,但不知道可以找到源代碼。更確定的是,我不想從深層的DLL樹中做這件事。 曾想過如何將名稱空間添加到web.config文件中,並知道如何訪問它,但又不符合我的需求。謝謝,但不是我正在尋找的答案。 +1雖然! – andleer 2009-11-09 17:32:32

+0

您可以通過將請求的URI映射到響應請求的物理文件,然後通過System.IO.File.ReadAllText(path)讀取它,從而獲得頁面的源。如何將URI映射到物理路徑取決於您的URI方案;是否重寫,使用System.Web.Routing進行路由映射,還是什麼。 – 2009-11-09 17:47:31