強いタイピングの利点を維持しながら、特定のことを動的に行うことができるようにコードを生成するメカニズムをハックしようとしています。Visual StudioとC#/ VB.NETでのコード生成によるメタプログラミングのハッキング
ここでは、私がしたいことの種類の例です。私はこのようなオブジェクトを持っている:
Class Fruits
Public Property Apple As System.Int32
Public Property Orange As System.Int32
Public Property Kiwi As System.Int32
...quite a few others
Public Property Banana As System.Int32
Public Property Watermelon As System.Int32
Public Property Durian As System.Int32
End Class
と私はこのないいくつかのコードがあります。つまり
Dim dict = myEntity.ToDictionary()
Dim myFruits = {"Apple", "Banana", "Cherry"}
For Each fruit in myFruits
Dim fruitValue = dict(fruit)
doSomething(fruitValue)
Next
を、私は強く型付けされたクラスを持っていると私はプロパティにアクセスしたいですこれらのプロパティはコードで決定される文字列です。
私が避けたい問題は、Fruitsクラスが変更できることです。たとえば、Apple
プロパティが削除されました。これは、コード生成やリファクタリングのために作成されたものである可能性があります。 それでループ内のコードが壊れていますが、コンパイラはこのことについて私に警告する方法がありません。
これまでのところ、上記のコードは、これに相当します
fruitValue = item.Apple
doSomething(fruitValue)
fruitValue = item.Banana
doSomething(fruitValue)
fruitValue = item.Cherry
doSomething(fruitValue)
私はこのコードを持っていたと私はApple
を削除した場合、私はコンパイルエラーを取得したいとすべてがうまくなります。
実際には、私の果物のリストにはもっと多くのアイテムがあるかもしれませんし、複雑なデザインタイムルールによって決定されるかもしれないので、それらをすべて書き出すことは非常に退屈で、維持するのは面倒です。私が欲しいもの
は、インライン、タイプセーフコードを生成するように設計時のVisual Studioで前処理されたコードを書くための方法です。
私は、テンプレート、そのテンプレートへの入力、およびコードファイルをスキャンし、部分クラスファイルで必要なコード生成を行うある種のAddInを指定できるシステムと構文を想像しています。私は簡潔で動的なコードを書くことができましたが、基本的なオブジェクトアクセスが変更された場合にコンパイラエラーを引き起こす明示的なプロパティアクセスに拡張する必要があります。
質問:これはどのように実装できますか?
何が問題なのですか? –
@KeithPayne:私は自分の質問をそのように表現するように更新しました。 –
私はそれについて何も知らないが、私は "Roslyn"があなたが探しているものかもしれないと思う:https://github.com/dotnet/roslyn/wiki/Roslyn%20Overview – SSS