2016-03-22 9 views
-1

クラス名を含むデータベースから文字列を取得しています(例: "w_task1")。データベースからスクリプト名を取得すると、どのスクリプトかわからないので、w_task1 t = new w_task1()を書くことはできません。クラス名を含む文字列からクラスファイル名を呼び出す

代わりに、私はそれが(value of class name) t = new (value of class name)()の行に沿っていたいと思っています。

開こうとしているクラス名は、w_task1.cs - w_task25です。私は全体を使って試してみた

Type type = Type.GetType("w_task1"); 
object o = Activator.CreateInstance(type); 

...しかし、型がnullのプログラムのRANに等しいです。

クラスの種類を知らなくても、文字列からクラスを開くにはどうすればよいですか?

+0

ファイルを開くときのように「クラスを開く」ことはありません。アセンブリをロードし、実行時の型情報でクラスをインスタンス化します。 C#はPythonやいくつかのスクリプト言語のようではありません。 –

答えて

1

あなたの答えはここにある:get assembly by class name

この質問はマルクGravell

によって回答されてあなたのクラス名によって読み込まれたアセンブリを見つけなければならない(LINQが役立ちます)、その後はあなたを呼び出すために反射するものを行います方法。

私は重複してあなたの質問に印を付けました。

ファイル名でクラスを開くことはできません。 CLRがファイル名とクラスの間のリンクをどのようにすることができますか?

+0

年齢を探していたが見つかりませんでした。ありがとう!最後の質問が1つあります。クラスをインスタンス化しました。そのクラスから関数を呼び出すにはどうすればよいですか? –

+0

まず回答をお寄せください:) Googleからの第2の回答:http://stackoverflow.com/questions/6472980/how-to-instantiate-the-class-in-an-assembly-using-reflection-with-c -net – pix

1

完全な名前空間とクラス名を指定する必要があります。

私はおそらくこのような何か(名前空間は常に同じであることを考えるとタイプが同じアセンブリ内で発見された)だろう。

Assembly.GetExecutingAssembly().GetType("MyApp.Scripts." + my_string); 

また、することができます

  • 店DBへのネームスペース
  • あなたのアセンブリ内のすべてのタイプを、名前といくつかのインターフェイス、おそらくより多くの基準で検索します。
  • には、文字列をよく知られた型名にマッピングする辞書があります。

セキュリティを考慮してください:このデータはどこから来たものですか?ユーザーは何とかそれを注入できますか?任意のクラスをロードし、おそらく実行することができます。

私はインターフェイスを使用します。

IScript o = (IScript)Activator.CreateInstance(type); 

は、より多くの反射の使用を削減し、セキュリティを向上させるだろう両方。

+0

ありがとう、私はそれを試してみましょう! –

+0

Assembly.GetExecutingAssembly()。GetType(string.Format( "MyApp.Scripts。{0}"、my_string)); IScript o = IScriptとしてのActivator.CreateInstance(タイプ)。 if(IScript!= null){doSomething} はさらにクリーンです。 – pix

+0

@pix:必ずしもそうではありません。文字列形式を使用する場合、文化情報を提供することを忘れないでください。それは非常に肥大し、そのような単純なもののために読めない。型が予期されたインタフェースを実装していない場合は、実際にはプログラミングエラーであり、ユーザーが間違って行うことはできません。型キャスト例外が予想されるため、特別な処理は必要ありません。 –

関連する問題