2012-01-23 12 views
5

Activator.CreateInstanceを使用してインスタンスを動的に作成しています。しかし、それはオブジェクトがすべての試みでnullになることはできないと言っています。以下のコードを貼り付けます。私は間違って何かしていますか?Activator.CreateInstance failed

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

を使用して正確ないずれかの代わりにType.GetTypeの??:あなたがする必要はあり –

答えて

3

取得するタイプのアセンブリ修飾名。 AssemblyQualifiedNameの を参照してください。型が現在実行中の アセンブリまたはMscorlib.dllにある場合は、その名前空間で修飾された型名 を渡すだけで十分です。

これは、あなたが(少なくとも)する必要があることを意味し、同様の名前空間を渡す:

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

GetTypeメソッドが失敗し、nullを返しています。前のリンクのパラメータセクションを参照してください。

取得するタイプのアセンブリ修飾名。 AssemblyQualifiedNameを参照してください。型が現在実行中のアセンブリまたはMscorlib.dllにある場合は、その名前空間で修飾された型名を指定すれば十分です。

"Derived"前に名前空間を追加し、Derivedクラスが異なるアセンブリにある場合は、最後に", assemblyname"を追加します。


あなたがGetTypeに渡す文字列を変更するつもりはない場合(その場合にはActivator.CreateInstanceを使用して多くのポイントがありませんが)、その後、あなただけのtypeof(Derived)を使用できることに注意してください。 Type.GetTypetypeNameパラメータの文書から

3

まあ、Type.GetType("Derived")はほぼ確実にヌルを返している - それActivator.CreateInstanceとは何の関係も作ることになります。

チェック:

  • は、呼び出し元のコードと同じアセンブリ内のDerivedですか?そうでない場合、あなたはType.GetType()
  • に渡している右側のアセンブリにAssembly.GetTypeを使用し、または型名にアセンブリ名が含まれる名前空間であなたのタイプですか?その場合は、名前空間修飾するためにそれを
+0

このメソッドは、実行時にオブジェクト型を決定するための従来のswitch/caseステートメントを置き換えても問題はありませんか?ありがとう。 – logeeks

+0

@logeeks:正直言って、あなたが意味することは本当に明確ではありません。 –

+0

私のプログラムでは、サーバーからenum値を受け取っています。その列挙値は、どのオブジェクトを作成しなければならないかを決定します。例:哺乳動物mb;スイッチ(MammalType):ケースCat:mb = new Cat();ブレーク;ケースDog:mb = new Dog();私は何とかenum値の名前を取得することができるかどうかを尋ねていた、私はスイッチのcase文に依存せずに、単一のステートメントでクラスオブジェクトを構築することができます。このアプローチには欠点がありますか? – logeeks

3

Type.GetType("Derived"がタイプ

は、実行時にこの

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

その場合、 'Base report = new Derived(); 'はもっと簡単でしょうか? –

+0

はい、しかし、私はこれ(質問)は単なるサンプルだと思います。 – dknaack

+2

私もそうだと思いますが、コンパイル時にタイプが分からないことが重要なポイントだとも思います。それが(あなたの答えのように)あれば、 'Activator.CreateInstance'を全く使う必要はありません。 –

0

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

を変更Simeple、あなたのGetTypeの呼び出しがする見つける傾ける必要があります返信null。 )(

  • )あなたの名前空間
  • か、(typeof演算を使用しない理由のtypeof
関連する問題