質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

11564閲覧

C#動的な未定義クラス作成およびそこへのメンバ追加

dore

総合スコア26

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

2クリップ

投稿2016/07/16 21:51

初心者です。

VSをもちいたC#で動的なプログラムを組みたいです。
getTTypeでクラスの型を取得しcreateIncetanseに引数を渡す、という方法で
あらかじめクラス名をメソッド内に記さなくてよいということはわかります。
しかしこの方法は、既に定義されているクラスを用いていますよね。

そこで、そのクラスのひな型自体が作れないか、ということです。
同様に未定義のプロパティを追加したりなどしてみたいです。

ハッシュを用いれば文字列と関連した値の取得が可能なのはわかるのですが、そうではなくクラスにメンバを追加してみたいです。

想定しているのはDBを選ばないModelとLogicの作成です。

可能でしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

C#動的な未定義クラス作成およびそこへのメンバ追加

外部プログラムで機能を追加ということして、
私だったら、
c# プラグイン機能
c# addon framework
などから、事例検索をしてみます。

想定しているのはDBを選ばないModelとLogicの作成です。

VS20xx が標準でサポートしているのは、
MS-SQL / ODBC / OLEDB です。(Oracle は.NetFrameWork 3.0からは非サポ)
それ以外のDB接続は、Native Client なり、ODBC/OLE-DB ドライバのインストール等が
必要になります。
⇒c# provider factory などで事例を検索してみてください。
VB.NET でもよければ、
やさしいVB.NET Provider Factory
などで。

注意点は、DBへの接続方法により、SQLの方言や、ワイルドカードが異なる点
MetadataCollection、Schemaで取得できる情報が異なる事など
⇒接続文字列、クエリ自体も、主として使うDBで管理してしまうなど。

動的クエリの実行は
SQL 動的クエリ 実行
などで検索します。
SELECT だけであれば、Linq な方法も。
⇒いっそのこと、xml / JSON 出力にしてしまうとか

必要な機能を書出して、実装に必要な共通部分、専用部分を
箇条書きにしたりします。
DBの機能として何があるか、返却値としてどの様なパターンがあるか等

接続文字列は、↓のサイトが一番まとまっています。
The Connection Strings Reference
http://www.connectionstrings.com/

投稿2016/07/16 22:33

編集2016/07/16 22:35
daive

総合スコア2030

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dore

2016/07/17 18:14

まだ始めたばかりなので理解しきれていないですが、動的なDB作成で疑問に思っていた箇所や引っかかりそうな箇所の一覧は大変ありがたいです。 ありがとうございます。いろいろとみてみます。
daive

2016/07/17 23:02 編集

ODBC データソースアドミニストレータを使う場合は、 x64 / x32 の別に注意してください。 Windows 7 x64 系列では、32 ビット版はスタートメニューには、いないので ODBC データ ソース (32 ビット) %windir%\syswow64\odbcad32.exe ODBC データ ソース (64 ビット) %windir%\system32\odbcad32.exe ドライバx64 / x32 ⇒ DSN登録も x64 / x32 の別で必要 ’ 【結構重要な注意点】 MS-SQL Server x32版、x64版/ JET-MDB , ACCDB など、 x32(=x86) 版しかドライバが無い、排他インストールである などを考慮すると、プラットフォームを指定してコンパイルする事は重要です。 プラットフォーム:Any CPU では、デバッグ、リリースしない。 ソリューションプラットフォームは、 構成マネージャー⇒プラットフォームで指定します。 Any CPU / x86 / x64 / Mixed など、一覧に無い場合は追加します。 Debug / Relase C#で、OFFICEをInerrop経由で使用する場合にも、x86 / x64 の別を指定します。 Mixed :ソリューションレベルでは、別言語のプロジェクトを含む事が可能です。     プロジェクト内では、行わない方が良いです。 ソリューション:プロジェクトを1つ以上含みます。 ’ OLE-DBの mdb / accdb 用ドライバは、アクセスランタイムモジュールなどで 入手可能ですが、x32 / x64 は排他インストール。 ⇒JET-MDB は、MDACから扱いますのでx32版のみ、  ACCESS2013&ACCESS2013RUNTIMEを入れると、  mdb は、ACCESS2000以後の形式しか扱えなくなります。 MS-SQL Server 2000以前 と、2005以後、2016以後では、 Native Client での扱いで注意が必要かも。 MySQL Connector はインストール失敗で、 OSから再インストールになりかねないので、 OSの完全バックアップを取ってから、インストールを行います。
daive

2016/07/17 23:23

検索ワード Windows UDL file コードから扱う接続文字列に困った場合は、 拡張子 UDL のファイルで接続ウィザード的に 接続文字列の試行ができますが、 Windows x64 / x32 で表示される物が異なります。 中身はテキストですので、メモ帳で開く事も可能です。 ⇒Windows x32版、x64版の両方があると違いが、直ぐに判るのですが。。。
dore

2016/07/18 15:13

追記ありがとうございます。 理解が追い付いていないですが、プラットフォームを考慮しないとだめだということですよね。x32 / x64などもそこに含まれる、ということで。 先にあった共通部分と専用部分のを洗い出すときに思い出すようにします。 まずは一つで成功を目指そうと思います。
guest

0

ベストアンサー

可能です。
TypeBuilder クラス を使って定義して、CreateType() で作成します。

System.Reflection.Emit 名前空間に含まれるクラスを使ってください。
指定した型のプロパティを持つクラスを動的に生成する に実例があります。

###追記
正攻法でクラスを作るのは、ご覧のように IL を扱うので、アセンブラに慣れていなければなかなか勉強を要すると思います。
もう二つ選択肢に入れてみてください

  1. CSharpCodeProvider を使う

C# で記述してメモリ内に実行ファイルを作成し、新しいクラスをリモートオブジェクトとして返します。

  1. 疑似クラスを使う

Dictionary<T, U> などにデリゲートを追加してメソッドのようなふるまいをさせます。

投稿2016/07/16 22:08

編集2016/07/16 22:36
Zuishin

総合スコア28673

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dore

2016/07/16 22:18

ありがとうございます。試してみます。
dore

2016/07/17 18:17

難易度が高いんですね。 理解できるところから手を付けてみます。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問