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,我不想要缓存值,我想要评估最后一级(即:TwoLevelDeepAfor Member1而不必解析整个“链”(即:RootProperty1.OneLevelDeep1for Member1),我该怎么做? (我觉得这很简单,我现在只是在放屁。)

想法1,玩指针。我不确定我想为此采用不安全的方式,我相信有更好的解决方案。

想法 2,玩得开心 Func()。例如,如果Member1是 Func,我可以这样做:

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

如果我需要Member1成为一个属性,我可以只创建一个调用的底层方法(而不是字段)_member1并将它与Member1属性包装起来。

想法 3,在LiteOne. LiteOne可以有 3 个类型的基础字段typeof(myFatOne.RootProperty1.OneLevelDeep1)typeof(myFatOne.RootProperty1.OneLevelDeep2)typeof(myFatOne.RootProperty2)Member1,Member2Member3属性包装,分别获得TwoLevelDeepA,TwoLevelDeepBOneLevelDeep成员。我认为这会导致一个问题,但是如果其中一个基础字段是不可变的。

还有其他(更好的)想法吗?

4

0 回答 0