2011-04-06 27 views
10

在C#中,我怎麼能找出一個Type可以被實例化?我想避免一個Activator.CreateInstance異常。查找出來,如果類型實例化

我目前的方法是type.IsClass && !type.IsInterface,但我擔心這可能會在抽象類等失敗。我也考慮檢查type.TypeInitializer == null,但我不知道這是否是萬無一失的。

什麼是最簡單/最有效的方式,以找出是否一個Type是實例化?

+4

有'type.IsAbstract'。 – 2011-04-06 19:19:10

+1

爲了「安全」,他不必檢查GetConstructor()返回的ConstructorInfo對象上的IsPublic和相似的屬性。我不知道。我在問.. – 2011-04-06 19:27:27

回答

7

還有許多其他的陷阱。它可以有一個私有或受保護的構造函數。或者它可能沒有默認構造函數,只有構造函數採用某些參數類型。如果你不必擔心這個問題,那麼當它不應該被使用的時候你肯定會使用Activator.CreateInstance()。只是隨意構建對象只會造成破壞,你不知道它們可能會產生什麼樣的副作用。避免使用「FormatDisk」類。

一個例外是你的朋友,它告訴你,你的假設是錯誤的。永遠不要有意阻止.NET框架的幫助。

+0

我正在創建接口實現的實例,所以我確實瞭解了一些接口的實現。不過,我欣賞這個警告。 – user664939 2011-04-06 19:35:15

+0

優秀,那麼你不應該擔心異常或意外創建一個抽象類。一個簡單的知名名字可以完成工作。 – 2011-04-06 19:35:46

+0

我將如何去檢查默認的構造函數? – user664939 2011-04-06 19:38:08