public static Member HasMembersPossiblyOnParent(IHavePossibleMembers parent, IKey key, Func <Member> member) { if (parent.PossibleMembers.TryGetValue(key, out var res)) { return(res); } res = member(); parent.PossibleMembers.Add(key, res); return(res); }
public Member CreateMemberPossiblyOnParent(IStaticScope scope, IHavePossibleMembers havePossibleMembers, IKey key) { // this is weird, but since C# does not have and types... // scope and havePossibleMembers are expected to be the same object if (!ReferenceEquals(scope, havePossibleMembers)) { throw new Exception($"{scope} and {havePossibleMembers} should be the same object"); } if (havePossibleMembers.PossibleMembers.TryGetValue(key, out var res1)) { return(res1); } var res = HasMembersPossiblyOnParent(havePossibleMembers, key, () => new Member(this, "possibly on parent -" + key.ToString())); res.Context = Possibly.Is(scope); return(res); }