// ========================================================================== // FuncDispatcher.cs // PinkParrot Headless CMS // ========================================================================== // Copyright (c) PinkParrot Group // All rights reserved. // ========================================================================== using System; using System.Collections.Generic; using System.Linq; using System.Reflection; namespace PinkParrot.Infrastructure.Dispatching { public sealed class FuncDispatcher { private static readonly Dictionary> Handlers; static FuncDispatcher() { Handlers = typeof(TTarget) .GetMethods() .Where(Helper.HasRightName) .Where(Helper.HasRightParameters) .Where(Helper.HasRightReturnType) .Select(FuncDispatcherFactory.CreateFuncHandler) .ToDictionary(h => h.Item1, h => h.Item2); } public static TOut Dispatch(TTarget target, TIn item) { Func handler; return Handlers.TryGetValue(item.GetType(), out handler) ? handler(target, item) : default(TOut); } } }