如何在 C 中使用 反射

2021-10-18 01:31:34 字數 2294 閱讀 2538

c# 中的反射常用於在程式的執行時獲取型別的元資料,可獲取的資訊包括已載入到程序中的程式集型別資訊,它和 c++ 中的rtti(runtime type information)的作用是差不多的。

為了能夠使用反射,需要在專案中引用system.reflection命名空間,在使用反射的開始,你會獲取乙個 type 型別的物件,從這個物件上進一步獲取程式集,型別,模組等資訊,可以通過 反射 動態的生成某個型別的例項,甚至還能動態呼叫這個型別上的方法。

system.reflection命名空間下,定義了如下幾大核心型別。

現在我們一起研究一下怎麼使用,考慮下面定義的 customer 類。

public class customer

public string firstname

public string lastname

public string address

}

下面的**片段展示了如何通過 反射 來獲取 customer 的類名以及 customer 的所屬命名空間。

再看乙個例子,如何通過反射獲取 customer 下的所有屬性,並且將屬性名字全部展示在控制台上,如下**所示:

值得注意的是,typeof(customer).getproperties()預設只能獲取 標記為 public 的屬性集合,對應著 customer 類下的四個公開屬性。

接下來再來看看如何通過反射獲取型別下的 建構函式 和 公共方法 的元資料資訊,這裡還是繼續使用customer類,在類中新增乙個 建構函式 和乙個 validate 方法,此方法用於校驗入參的合法性,下面就是修改後的 customer 類。

public class customer

public string firstname

public string lastname

public string address

public customer()

public bool validate(customer customerobj)

}

然後再來看看通過 反射 來獲取 customer 下所有定義的建構函式,不過這裡只定義了乙個建構函式,因此只能列出乙個。

同樣也要注意,預設情況下getconstructors()方法只能獲取 customer 的所有標記為 public 的建構函式。

接下來看看如何展示 customer 中的所有 public 方法,因為該類中只定義了乙個 public 方法,所以控制台上也應該只會展示乙個,如下**僅供參考。

是不是很驚訝,剛才還說是乙個方法,居然多了好幾個,要知道多的那幾個方法,來自於兩方面。

相信在你的應用程式中,經常會在 領域實體 上使用各種 attribute 特性,這時候就可以通過上面的**反射提取 領域實體 中的方法上的attribute資訊,從而根據提取到的 attribute 執行你的具體業務邏輯。

更多高質量乾貨:參見我的 github: csharptranslate

如何在C 中使用WebService

將他解壓後,進入到資料夾 gsoap 2.8.18 gsoap 2.8 gsoap bin win32 裡面有2個我們要用到的exe,wsdl2h.exe和soapcpp2.exe,如果缺少乙個typemap.dat,則從gsoap 2.8.18 gsoap 2.8 gsoap下拷貝進來,最後就可以...

如何在 C 中使用 RabbitMQ

rabbitmq 是乙個非常流行的,開源的,使用erlang語言編寫的框架,通常在電信級平台中作為訊息中介軟體使用,rabbitmq實現了高階的amqp協議用於實現程序間,應用程式間,伺服器之間的訊息互動,而且它還有乙個非常?的特性,你可以使用自定義外掛程式來擴充套件rabbitmq的功能,而且它還...

如何在 C 中使用 Attribute

attribute 在 c 中是乙個非常強大的特性,它能夠給你的程式集新增元資料資訊。attribute 實際上是乙個物件,它可以與以下元素中的任何乙個相關聯 程式集 類 方法 委託 列舉 事件 字段 介面 屬性和結構,它會在這些物件上做資訊宣告,當程式執行之後,你可以通過反射來獲取關聯到這些物件上...