次のメンバー式を検討してください
someObject.someMethod(p => p.FirstName)
someObject.someMethod(p => p.Contact.Address.City)
式をたどり、各メンバーを調べて、特定の属性で装飾されているかどうかを判断するコードを書いています。これの目的は、次のような「パス」を生成することです。
p.Contact.Address.City -> "Contact.Address.City"
ただし、特定の属性で装飾されている場合、パスは別の名前で生成されます。
...
[BsonElement("Locale")]
public string City {get; set;}
...
p.Contact.Address.City -> "Contact.Address.Locale"
参考までに: これは、MongoDB を操作するために作成している小さなライブラリ用です。
そのため、式のウォークと属性のチェックは、リフレクションを使用して行われます。それほど遅くはありませんが、改善の余地があります。
パス解決 (MemberExpression を文字列に) にキャッシングを追加したいのですが、MemberExpression の署名\ハッシュを生成するための最良\最も効率的な方法がわかりません。
いくつか試してみましたが、実際にはコードの速度が低下しました。このメソッドは、ルックアップに使用できるように毎回ハッシュを生成するのに十分な速さである必要があり、明らかに式をたどるよりも高速である必要があります。
何かご意見は?
編集: コードはこちら: https://github.com/bryanmig/MongoFluentUpdater/blob/master/FluentUpdate/FluentUpdater.cs (改善の余地があることはわかっていますが、初期のプロトタイプです)