2016-05-10 1 views
0

問題を解決できなかったため、以前の投稿に再参照しています。 C# convert string to class that has a constructor with string parameterまだ知られていないクラスタイプにオブジェクトタイプをキャストする

私は、与えられた文字列をクラス型に変換してインスタンス化しようとしているループがあります。これらのクラスには、データベースへの接続文字列である文字列型パラメータを持つコンストラクタがあります。

これまではOKと思われます。 ExampleClass1、ExampleClass2、ExampleClass3 ...

Type type = Type.GetType("ExampleClass1"); 
object instance = Activator.CreateInstance(type, "connection_string_param"); 

しかし、私は(instance.DoSomething経由クラスメソッドにアクセスしようとすると)私はエラーが表示される - オブジェクトは、ときに.... doSomethingのための定義が含まれていません。私はクラスの通常の方法をインスタンス化、私はクラスのメソッドを見ることができます。 Arturo Menchacaはキャストすることを提案していましたが、彼の助けを以前に感謝しましたが、 'オブジェクトタイプ'を '特定のクラスタイプ'にキャストすることは、クラスタイプが未知の場合には機能しません。インスタンス(タイプ)を試しても動作しません... 何か助けていただければ幸いです。

+0

静的型付けの全体点は、静的情報を使ってコンパイラが少なくともデータ型の正当性を検証できることです。明らかに静的なタイプの情報はありません。だから、コンパイラは何を確認するのだろうか?一方で、型チェックを一切スキップし、実行時の型に過負荷解決を委譲する場合は、 'object'ではなく' dynamic'を使用してください。 –

+2

ほとんどの場合、インターフェイスが何であるかを少しだけ読んでから、クラスのインターフェイスを実装する必要があります。 – Evk

+0

http://stackoverflow.com/questions/7598088/purpose-of-activator-createinstance-with-exampleご提案のための –

答えて

2

DoSomething()は、objectで定義されていません。それはあなたのExampleClass1に定義されています。これではありませんしかし、あなたは、あなたのデザインを再考する必要があり

object instance = Activator.CreateInstance(type, "connection_string_param"); 
instance.GetType().GetMethod("DoSomething").Invoke(instance, null); 

あなたはそれdynamicオブジェクト作成し、それを直接呼び出すことができます。

dynamic instance = Activator.CreateInstance(type, "connection_string_param"); 
instance.DoSomething(); 

あるいは、反射によってそれを呼び出すに良い考えです。

関連する問題