public static IFormatterBuilder GetBuilder( FormatterRequest request ) { IFormatterBuilder builder = _builders.FirstOrDefault( b => b.CanCreate( request ) ); if ( builder == null ) throw new SerializationTypeBinaryAnalysisException( request.Type ); return builder; }
public static Task <IFormatter> GetFormatterAsync(Type type, bool isPolymorph) { FormatterRequest key = new FormatterRequest(type, isPolymorph); if (_formatters.TryGetValue(key, out Task <IFormatter> task)) { return(task); } TaskCompletionSource <IFormatter> completionSource = null; bool lockTaken = false; try { _lock.Enter(ref lockTaken); if (_formatters.TryGetValue(key, out task)) { return(task); } completionSource = new TaskCompletionSource <IFormatter>(); _formatters.Add(key, completionSource.Task); } finally { if (lockTaken) { _lock.Exit(); } } IFormatter formatter = CreateFormatter(key); completionSource.SetResult(formatter); return(completionSource.Task); }
private static IFormatter CreateFormatter(FormatterRequest request) { IFormatterBuilder builder = BuilderResolver.GetBuilder(request); return(builder.Create(request.Type)); }