public bool Sync() { IsChanged = FAutoValidate ? FNodeIn.PinIsChanged : FNodeIn.Validate(); if (IsChanged) { object usI; FNodeIn.GetUpstreamInterface(out usI); FNodeIn.GetUpStreamSlices(out FLength, out FUpStreamSlices); // Check fastest way first: TUpstream == T var wrapper = usI as DynamicTypeWrapper; if (wrapper != null) { usI = wrapper.Value; } FUpstreamStream = usI as MemoryIOStream <T>; if (FUpstreamStream == null) { // TUpstream is a subtype of T // Copy the upstream stream through the covariant IEnumerable interface var enumerable = usI as IEnumerable <T>; if (enumerable != null) { FUpstreamStream = enumerable.ToStream(); } if (FUpstreamStream == null) { // TUpstream to T needs explicit cast // For example TUpstream is a value type and T is a reference type var objects = usI as IEnumerable; if (objects != null) { FUpstreamStream = objects.Cast <T>().ToStream(); } else { // Not connected FUpstreamStream = FNullStream; FUpstreamStream.Length = FLength; using (var writer = FUpstreamStream.GetWriter()) while (!writer.Eos) { writer.Write(FDefaultValue); } } } } } return(IsChanged); }
public bool Sync() { IsChanged = FAutoValidate ? FNodeIn.PinIsChanged : FNodeIn.Validate(); if (IsChanged) { object usI; FNodeIn.GetUpstreamInterface(out usI); // Check fastest way first: TUpstream == T FUpstreamStream = usI as MemoryIOStream <T>; if (FUpstreamStream != null) { FNodeIn.GetUpStreamSlices(out FLength, out FUpStreamSlices); } else { FLength = FNodeIn.SliceCount; // TUpstream is a subtype of T var enumerable = usI as IEnumerable <T>; if (enumerable != null) { FUpstreamStream = new MemoryIOStream <T>(FLength); FUpstreamStream.Length = FLength; using (var writer = FUpstreamStream.GetWriter()) foreach (var item in enumerable) { writer.Write(item); } } else { // Not connected FUpstreamStream = FNullStream; FUpstreamStream.Length = FLength; } } } return(IsChanged); }