2

私は単純なORMライブラリに取り組んでいますが、実際には非常に単純です...

タイプTのクエリがあります

public IEnumerable<T> Query<T>(string query)

このメソッドはTクラスを取得し、プロパティを取得してループし、それに応じて設定します

aProperty.SetValue(tmpGenericObjectOfTypeT, newValue, null);

私の問題は、SetValueが非常に遅いことです。Reflection.Emitを使用するか、デリゲートを使用するかの2つの選択肢がありますが、残念ながら、これらの方法がわかりません。

私が読んだように、デリゲートの使用はもう少しエレガントであり、その解決策が欲しいのですが、それを行う方法が本当にわかりません。デリゲートを使用してメソッドを呼び出す方法について多くのことを検索して見つけました。しかし、プロパティを設定する方法ではありません...

4

2 に答える 2

1

プロパティを取得/設定する方法を知っている動的メソッドまたは式ツリーは、ここに行く方法です。速くて簡単。

  • リフレクションを使用してタイプのインターフェースを調べる
  • ゲッター/セッターActions/Funcsを構築し、それらを元の型に関連付けるオブジェクトにキャッシュします。
  • 後続の操作でキャッシュされた getter/setter を使用しました。

リフレクションよりも少なくとも 20 倍のパフォーマンス向上が見られるはずです (50 ~ 100 倍程度ではないにしても)。

于 2012-05-16T03:37:40.723 に答える
0

HyperDescriptor はかなりうまく機能します (ReflectionEmit ベース)。 http://www.codeproject.com/Articles/18450/HyperDescriptor-Accelerated-dynamic-property-acces

「デリゲート」メソッドはおそらく式ツリーを参照していますか?

于 2012-05-16T03:33:49.917 に答える