尽管我通常更喜欢问一个理论问题并稍后给出一个例子,但我会用一个例子来解释这种情况,因为我不知道从哪里开始(问题以粗体突出显示):
假设我有一个对象(我们称他为他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
,我不想要缓存值,我想要评估最后一级(即:TwoLevelDeepA
for Member1
)而不必解析整个“链”(即:RootProperty1.OneLevelDeep1
for 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
,Member2
和Member3
属性包装,分别获得TwoLevelDeepA
,TwoLevelDeepB
和OneLevelDeep
成员。我认为这会导致一个问题,但是如果其中一个基础字段是不可变的。
还有其他(更好的)想法吗?