private TResult DoVisit<TResult, TContext>(TContext context, Delegate visitor) where TResult : Value, new() { ValueVisitorDelegate<TResult> contextFreeVisit = (visitor as ValueVisitorDelegate<TResult>); ValueVisitorDelegate<TResult, TContext> contextBoundVisit = (visitor as ValueVisitorDelegate<TResult, TContext>); IList<Value> newContent = new List<Value>(); if (visitor != null) { TResult changed = ((contextBoundVisit != null) ? contextBoundVisit(context, this, contextBoundVisit) : contextFreeVisit(this, contextFreeVisit)); if (changed != this) return changed; foreach (Value value in Content) { TResult replaced = ((contextBoundVisit != null) ? value.Visit<TResult, TContext>(context, contextBoundVisit) : value.Visit<TResult>(contextFreeVisit)); if (replaced != null) newContent.Add(replaced); } } if (newContent.Count > 0) content = newContent.ToArray(); return (this as TResult); }
public TResult Visit<TResult, TContext>(TContext context, ValueVisitorDelegate<TResult, TContext> visitor) where TResult : Value, new() { return ContextBoundVisit<TResult, TContext>(context, visitor); }
public TResult Visit<TResult>(ValueVisitorDelegate<TResult> visitor) where TResult : Value, new() { return ContextFreeVisit<TResult>(visitor); }
public Value Visit<TContext>(TContext context, ValueVisitorDelegate<Value, TContext> visitor) { return Visit<Value, TContext>(context, visitor); }
public Value Visit(object context, ValueVisitorDelegate<Value, object> visitor) { return Visit<object>(context, visitor); }
public Value Visit(ValueVisitorDelegate<Value> visitor) { return Visit<Value>(visitor); }
private TResult ContextFreeVisit<TResult>(ValueVisitorDelegate<TResult> visitor) where TResult : Value, new() { return DoVisit<TResult, object>(null, visitor); }