0

私は通常、理論的な質問をして後で例を示すことを好みますが、どこから始めればよいかわからないため、例を挙げて状況を説明します (質問は太字で強調表示されています)。

多くのプロパティ、フィールド、メカニズムなどを持つオブジェクト(彼と呼びましょう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.OneLevelDeep1Member1

アイデア 1、ポインターで遊ぶ。そのために安全でないスタイルに行きたいかどうかはわかりませんが、より良い解決策があると確信しています。

アイデア 2、Func() を楽しんでください。たとえば、Member1が Func の場合、次のようにすることができます。

var tmp = myFatOne.RootProperty1.OneLevelDeep1;
myLiteOne.Member1 = new Func<T>(() => tmp.TwoLevelDeepA);

プロパティにする必要がある場合は、 (フィールドではなく)基になるメソッドMember1を作成し、それをプロパティでラップするだけです。_member1Member1

アイデア 3、基礎となるフィールドを on にしLiteOneます。LiteOneタイプ の 3 つの基礎となるフィールドを持ち、、およびメンバーをそれぞれ取得するtypeof(myFatOne.RootProperty1.OneLevelDeep1)typeof(myFatOne.RootProperty1.OneLevelDeep2)およびプロパティでラップtypeof(myFatOne.RootProperty2)することができます。ただし、基になるフィールドの1つが可変でない場合、これは問題を引き起こすと思います。Member1Member2Member3TwoLevelDeepATwoLevelDeepBOneLevelDeep

他の(より良い)アイデアはありますか?

4

0 に答える 0