2012-01-23 25 views
5

我有使用Activator.CreateInstance動態創建實例。但是,它表示在每次嘗試時對象都不能爲空。粘貼下面的代碼。我做錯了什麼?Activator.CreateInstance失敗

有如果

Activator.CreateInstance

代替用於確定在運行時間的對象類型的現有開關/ case語句的任何問題?謝謝。

public abstract class Base 
{ 
    public abstract void Func(); 

} 
public class Derived:Base 
{ 
    public override void Func() 
    { 
     MessageBox.Show("Derived First"); 
    } 
} 

public class Derived2 : Base 
{ 
    public override void Func() 
    { 
     MessageBox.Show("Derived Second"); 
    } 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    // I was trying to make use of the overladed version 
    // where it takes the Type as parameter. 
    BaseClass report = 
     (BaseClass) Activator.CreateInstance(Type.GetType("Derived")); 
    report.Func(); 
} 
+0

你爲什麼不使用typeof運算(),而不是Type.GetType()? –

回答

3

Type.GetTypetypeName參數的文件:

類型的程序集限定名稱來獲得。請參閱 AssemblyQualifiedName。如果類型位於當前正在執行的 程序集或Mscorlib.dll中,則只需提供名稱空間限定的類型名稱 就足夠了。

這意味着你需要(至少)通過命名空間,以及:

BaseClass report = (BaseClass) Activator.CreateInstance(Type.GetType("YourNamespace.Derived")); 
1

GetType方法失敗並返回null。請參閱上一個鏈接的參數部分。

要獲取的類型的程序集限定名稱。請參閱AssemblyQualifiedName。如果該類型位於當前正在執行的程序集或Mscorlib.dll中,則只需提供由其名稱空間限定的類型名即可。

"Derived"之前添加命名空間,如果Derived類是在不同的裝配,然後添加", assemblyname"到最後。


請注意,如果你不打算改變你進入GetType字符串,那麼你可以只使用typeof(Derived)(雖然在這種情況下,沒有使用Activator.CreateInstance多點)。

3

好,Type.GetType("Derived")幾乎可以肯定返回空 - 這將使它無關Activator.CreateInstance

檢查:

  • 是在同一組件調用代碼Derived?如果沒有,請在右邊的程序集上使用Assembly.GetType,或者在要傳遞的類型名稱中包含程序集名稱Type.GetType()
  • 是您在命名空間中的類型?如果是這樣,你需要名稱空間限定它
+0

如果此方法在運行時替換用於確定對象類型的常規開關/事件語句,是否有任何問題?謝謝。 – logeeks

+0

@logeeks:說實話,這不太清楚你的意思。 –

+0

在我的程序中,我從服務器接收枚舉值。該枚舉值將決定必須創建的對象。例如:哺乳動物mb;開關(MammalType):case Cat:mb = new Cat();打破;情況狗:mb =新狗();我問我是否可以以某種方式檢索枚舉值的名稱,我可以使用它在一個語句中構造類對象,而不是依賴於switch case語句。這種方法有什麼缺點嗎? – logeeks

3

Type.GetType("Derived"找不到

Simeple改變

BaseClass report = (BaseClass) Activator.CreateInstance(Type.GetType("Derived")); 

這個

Base report = (Base)Activator.CreateInstance(typeof(Derived)); 
+1

在這種情況下,我猜'Base report = new Derived();'會更簡單嗎? –

+0

是的,但我認爲這個(問題)只是一個樣本。 – dknaack

+2

我也這麼認爲,但我也認爲一個關鍵點是該類型在編譯時不知道。如果是(如你的答案),則根本不需要使用Activator.CreateInstance。 –

0

在運行時,你的GetType通話將類型返回null。你必須:

  • 無論是精確命名空間
  • 或使用的typeof