1

コードだけで生成されたフォームを表示するウィザードを作成しました。このフォームを使用すると、ユーザーはいくつかのデータベースとデータ セットをナビゲートし、最後にいくつかのデータを選択できます。それらが完了し、いくつかの変数が割り当て/変更されると、フォームはそれらに「OK」ボタンを表示するだけです。これまでのところ、私はこれをすべて行っています。

私の問題は、そのボタンをクリックすると、作成したカスタム クラス オブジェクト/エンティティを現在のソリューションに追加したいということです。新しいカスタムクラス、名前空間、およびすべてをコードのみで追加する方法がわかりません (そして、役立つものを見つけることができません)。

誰かがこれに関する指針や経験を持っているなら、それは大歓迎です!

4

2 に答える 2

2

この技術はメタプログラミングと呼ばれます。「Metaprogramming in .NET」というすばらしい本があり、クールな機能の使い方を紹介しています。

したがって、メタプログラミングの目的で、.NET は以下を提供します。

  1. リフレクション- クラスに関する情報を見つけたり、private/protected/internal フィールドやプロパティなどにアクセスしたりするために使用されます。また、codeproject に関する別の概要:リンク
  2. Reflection.Emit - 実行時に新しい型を作成する機能を提供します。
  3. 式ツリー- コードをデータとして格納するため。醜い構文 (IL コードほど醜くない) でメソッドを生成し、それらをコンパイルして、コンパイルされたラムダ関数から IL コードを取得することができます。
  4. CodeDom - テンプレート化されたコード生成と動的コンパイルを提供します。
  5. Text Template Transformation Toolkit 別名 T4 - beforecompile-time メタプログラミング。
  6. Binary Weaving - aftercompile-time メタプログラミング。FodyPostSharpのようなものです。あなたの場合ではなく、概要のためだけに
  7. そして特別な機能: .NET には、動的型付け言語の機能を .NET に提供する「動的言語ランタイム」という名前の部分があります。未定義のプロパティを定義できるExpandoObjectクラスがあります

以上、.NET のメタプログラミング機能の概要を簡単に説明しました。さて、あなたのケースについて。ソリューションのコード、実際にはファイルシステムのコードに新しいクラスを追加したい場合は、何を選択するかを自由にし、コードをテキストとして書くことさえできます。

しかし、ランタイム アプリケーションに新しいクラスを追加したい場合は、まず、なぜ新しいクラスを追加する必要があるのか​​、どのように使用するのかを決定する必要があります。

したがって、主なアイデア:最初にクラスを記述し、次にそれをランタイムに追加します。これで、このクラスのオブジェクトを作成する構文が醜くなりました。Activator.CreateInstance(yourRuntimeTypeInfo)またはにすることができますyourRuntimeTypeInfo.GetConstructor(...).Invoke(...)。次は何?コンパイル時にこの create メソッドから得られるものはすべて、単なるオブジェクトです。リフレクションを使用し、メソッドを見つけて、それを呼び出す必要があります: yourRuntimeTypeInfo.GetMethod(...).Invoke(...)。または、式ツリーを使用してメソッド情報を生成し、すべてのデータベース クラスの基本クラスを決定することもできます。何らかの形で基本クラスで生成されたメソッドを使用します。または方法があります。新しい型を追加せず、単に ExpandoObject (または ElasticObject) を使用し、そのメソッドをラムダとして記述します。その後はすべてメソッドを呼び出すだけです。または、辞書を使用することもできます。または、もう少し考えて、メタプログラミングなしで解決策を見つけることもできます。

于 2013-07-08T21:58:10.753 に答える