この技術はメタプログラミングと呼ばれます。「Metaprogramming in .NET」というすばらしい本があり、クールな機能の使い方を紹介しています。
したがって、メタプログラミングの目的で、.NET は以下を提供します。
- リフレクション- クラスに関する情報を見つけたり、private/protected/internal フィールドやプロパティなどにアクセスしたりするために使用されます。また、codeproject に関する別の概要:リンク
- Reflection.Emit - 実行時に新しい型を作成する機能を提供します。
- 式ツリー- コードをデータとして格納するため。醜い構文 (IL コードほど醜くない) でメソッドを生成し、それらをコンパイルして、コンパイルされたラムダ関数から IL コードを取得することができます。
- CodeDom - テンプレート化されたコード生成と動的コンパイルを提供します。
- Text Template Transformation Toolkit 別名 T4 - beforecompile-time メタプログラミング。
- Binary Weaving - aftercompile-time メタプログラミング。FodyやPostSharpのようなものです。あなたの場合ではなく、概要のためだけに
- そして特別な機能: .NET には、動的型付け言語の機能を .NET に提供する「動的言語ランタイム」という名前の部分があります。未定義のプロパティを定義できるExpandoObjectクラスがあります
以上、.NET のメタプログラミング機能の概要を簡単に説明しました。さて、あなたのケースについて。ソリューションのコード、実際にはファイルシステムのコードに新しいクラスを追加したい場合は、何を選択するかを自由にし、コードをテキストとして書くことさえできます。
しかし、ランタイム アプリケーションに新しいクラスを追加したい場合は、まず、なぜ新しいクラスを追加する必要があるのか、どのように使用するのかを決定する必要があります。
したがって、主なアイデア:最初にクラスを記述し、次にそれをランタイムに追加します。これで、このクラスのオブジェクトを作成する構文が醜くなりました。Activator.CreateInstance(yourRuntimeTypeInfo)
またはにすることができますyourRuntimeTypeInfo.GetConstructor(...).Invoke(...)
。次は何?コンパイル時にこの create メソッドから得られるものはすべて、単なるオブジェクトです。リフレクションを使用し、メソッドを見つけて、それを呼び出す必要があります: yourRuntimeTypeInfo.GetMethod(...).Invoke(...)
。または、式ツリーを使用してメソッド情報を生成し、すべてのデータベース クラスの基本クラスを決定することもできます。何らかの形で基本クラスで生成されたメソッドを使用します。または方法があります。新しい型を追加せず、単に ExpandoObject (または ElasticObject) を使用し、そのメソッドをラムダとして記述します。その後はすべてメソッドを呼び出すだけです。または、辞書を使用することもできます。または、もう少し考えて、メタプログラミングなしで解決策を見つけることもできます。