私は通常、理論的な質問をして後で例を示すことを好みますが、どこから始めればよいかわからないため、例を挙げて状況を説明します (質問は太字で強調表示されています)。
多くのプロパティ、フィールド、メカニズムなどを持つオブジェクト(彼と呼びましょうFatOne
)があり、そこから次の「リンクされた」プロパティを頻繁に取得したいとします。
myFatOne.RootProperty1.OneLevelDeep1.TwoLevelDeepA;
myFatOne.RootProperty1.OneLevelDeep2.TwoLevelDeepB;
myFatOne.RootProperty2.OneLevelDeep;
しかし、たまたま評価のコストが非常に高くOneLevelDeep2
なりRootProperty2
ます。質問のために、それらをキャッシュすることはできません。次のメンバーを含む軽量オブジェクト(もちろん呼び出されます)を作成したいと思います(LiteOne
メソッド、フィールド、またはプロパティではなく「メンバー」を使用したことに注意してください。それが問題であるためです。)
myLiteOne.Member1 (refers directly to 'myFatOne.RootProperty1.OneLevelDeep1.TwoLevelDeepA')
myLiteOne.Member2 (refers directly to 'myFatOne.RootProperty1.OneLevelDeep2.TwoLevelDeepB')
myLiteOne.Member3 (refers directly to 'myFatOne.RootProperty2.OneLevelDeep')
もちろん、 を呼び出すときmyLiteOne.Member1
、キャッシュされた値は必要ありません。 「チェーン」全体(つまり、 for ) を解決する必要なく、最後のレベル(つまりTwoLevelDeepA
、 for Member1
)の評価が必要ですが、どうすればそれができますか?
(私はそれが本当に単純なことであり、私は今脳のおならをしているだけだと感じています。)RootProperty1.OneLevelDeep1
Member1
アイデア 1、ポインターで遊ぶ。そのために安全でないスタイルに行きたいかどうかはわかりませんが、より良い解決策があると確信しています。
アイデア 2、Func() を楽しんでください。たとえば、Member1
が Func の場合、次のようにすることができます。
var tmp = myFatOne.RootProperty1.OneLevelDeep1;
myLiteOne.Member1 = new Func<T>(() => tmp.TwoLevelDeepA);
プロパティにする必要がある場合は、 (フィールドではなく)基になるメソッドMember1
を作成し、それをプロパティでラップするだけです。_member1
Member1
アイデア 3、基礎となるフィールドを on にしLiteOne
ます。LiteOne
タイプ の 3 つの基礎となるフィールドを持ち、、およびメンバーをそれぞれ取得するtypeof(myFatOne.RootProperty1.OneLevelDeep1)
、typeof(myFatOne.RootProperty1.OneLevelDeep2)
およびプロパティでラップtypeof(myFatOne.RootProperty2)
することができます。ただし、基になるフィールドの1つが可変でない場合、これは問題を引き起こすと思います。Member1
Member2
Member3
TwoLevelDeepA
TwoLevelDeepB
OneLevelDeep
他の(より良い)アイデアはありますか?