2012-02-22 58 views
0

我想獲得一個對象使用反射,然後啓動該對象的方法。我從Type.GetType("my.namespace.item")變得空,所以我決定嘗試一個應該工作的測試。使用此代碼Type.GetType((new my.namespace.item()).GetType().FullName)我仍然收到null。似乎無法使用GetType與Activator.CreateInstance

這不應該發生在我所瞭解的事情上。我究竟做錯了什麼?

+0

你可以顯示你正在使用的函數,並指出你得到異常的行(NullReferenceException?),如果有的話? – Jay 2012-02-22 20:14:00

+0

@Jay:我特別在Type.GetType()上得到一個NullReferenceException,這就是爲什麼這是我包含的唯一代碼。 – 2012-02-22 20:20:46

回答

1

您只指定TypeFullName,這是(具有諷刺意味的)不是您需要的全名。 Type.GetType(string)需要TypeAssemblyQualifiedName爲了工作:

Type.GetType((new my.namespace.item()).GetType().AssemblyQualifiedName) 

應該罰款。它指定手動會是什麼樣子:

Type.GetType("Namespace.TypeName, MyAssemblyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b17a5c561934e089"); 

很明顯,你可以省略版本,區域性或公鑰如果他們不適用。

+0

如果我沒有類型,我怎樣才能得到AssemblyQualifiedName? Type存儲在數據庫中,因此我不會知道我特別需要'new my.namespace.item()'。另外,我不能保存版本,Culure和PublicKeyToken,因爲它們可能會發生變化。 – 2012-02-22 20:22:43

+0

使用Assembly.GetTypes()並匹配到數據庫以外的名稱。如果有多個程序集,則也會將程序集名稱添加到數據庫中。或者創建一個自定義屬性並修飾你想要顯示的類型。其中customer屬性的屬性是db中使用的名稱。 – 2012-02-22 20:40:19

+0

我剛剛將我的數據庫字段從「my.namespace.thing」更改爲「my.namespace.thing,my.namespace」。這工作。 – 2012-02-22 21:20:59