2012-12-12 41 views
0

我建議不要使用反射。我真的很想知道,是不是因爲Reflection是昂貴的?如果不是,避免使用它的原因是什麼?System.Reflection如何工作訪問類成員數據/信息?

我目前和未來的項目可能需要訪問任何給定的類成員信息。由於我有時需要列出字段&屬性 - 值或聲明名稱。

所以我想知道什麼是:

反射波如何工作的?它如何獲得信息? (一個簡短的解釋就可以)

爲什麼不推薦在應用程序中使用反射?如果您確實需要獲得所需的信息是字段或屬性值OR名稱,您是否可以通過使用System.Reflection來執行而不是

一些背景。

我當前項目中的用法(例如)是列出一個特定的sql server表 - 列名或SQL表名。

我可以想到其他方式將它作爲List<strings>返回。

如果我真的知道爲什麼或如何「壞」是,使用reflection

..我會再做出決定,如果我真的想避免它,因爲我可能會找到一個替代方法(在這個特定的情況下)。

無論是通過訪問數據庫(不是首選),我需要(說)表名列表或我可以做一次(訪問數據),然後將其存儲在文本文件或XML,如果我真的必須避免反射。

我知道一些更優雅的。雖然這不是問題。 (再次,這只是因爲可能有很多其他使用情況的例子,你可能知道)。

更新

,這一問題被關閉,請幫助重新打開它,並低於

票「重啓」謝謝 。

+1

如何使用反射來獲取SQL列的列表?爲什麼不從'INFORMATION_SCHEMA.COLUMNS'選擇*? – Blorgbeard

+2

@Blorgbeard。請 看到我的帖子的末尾讀它,直到最後,你可以更好地理解爲我所做的quetion本身BOLD – LoneXcoder

+2

@Blorgbeard你怎麼會認爲我已經完成它,讓所有的表列的身份是作爲第一位的一類?還是你提供每次我需要它作爲性能微調的數據庫? – LoneXcoder

回答

6

甲CLR組件(可執行文件或動態鏈接庫)通常含有約它的結構,這意味着有關的類型,結構,方法,字段,它們的名稱和一堆其他信息的信息的元數據,在「傳統「語言通常會丟失,只能由補償和大小信息取代。

反射是一種功能強大的工具,只能使用反射來實現一些(通常是高級)的東西。但是,它也引發了對安全和封裝的擔憂,因爲你開始依賴於程序的某些部分(或其他程序)的實現,而通常應該避免這些並且只相信這些部分給出的接口。另一個值得關注的問題是性能,因爲要訪問所有這些(最終是文本的)信息,程序會放慢速度,這與使用非反射方法(通常仍然使用偏移量和大小信息)相反。例如,您可以使用反射重新實現多態,並繞過虛擬方法表。但後者比前者快很多倍。

使用反射,如果你要,但如果你沒有不使用它。它是非常強大的工具之一,人們建議不要使用它們,但是如果你真的知道自己在做什麼,你可以使用它們。也就是說,請記住,以錯誤的方式使用反射技術不僅會引發上述問題,而且還會使代碼難以維護。

+2

加上一個如此信息量大,事實上,即使我不知道什麼是最你的技術基礎信息的描述,我可以很容易現在,能夠提取的一些關鍵條款上搜索。謝謝你......看起來你真的深入研究過它。 – LoneXcoder

+0

Chatzigiannaki,聽起來很愚蠢,但它讓我用左腳開始新的一天,(對不起我的英語......)雖然你能幫我一下嗎? **最後查看更新** – LoneXcoder

2

如果它像「從不使用反射」一樣簡單,我們根本就不會有反射。

反射慢,因此,您必須明智的使用它。通常情況下,有更好的解決方案(包括設計和性能)使用接口,委託等來實現您的目標(想到依賴注入和動態類型)。

試圖找出如何解決您的問題使用面向對象設計沒有反射。如果您確實需要使用反射,請考慮其性能如何影響您的應用程序,並進行相應的設計。

0

反射通過解析類類型信息起作用。因爲它的計算成本很高,所以要謹慎使用它。