/// <summary> /// Add target to calltable /// </summary> /// <param name="target"></param> private void AddToCallTable(object target) { var versions = target.GetType().GetCustomAttributes <VersionAttribute>(true) .Select(v => v.Numeric) .ToList(); if (versions.Count == 0) { versions.Add(ulong.MaxValue); } foreach (var version in versions) { var apply = target.GetType().GetMethod("ApplyAsync"); if (apply != null) { if (apply.GetParameters().Length != 0 || apply.ReturnType != typeof(Task)) { apply = null; } } var controller = new Controller(target, version, apply, _logger); foreach (var propInfo in target.GetType().GetProperties()) { if (!propInfo.CanWrite || propInfo.GetIndexParameters().Length > 1) { // must be able to write continue; } var name = propInfo.Name.ToLowerInvariant(); var indexers = propInfo.GetIndexParameters(); var indexed = false; if (indexers.Length == 1 && indexers[0].ParameterType == typeof(string)) { // save .net indexer as default if (name == "item") { name = kDefaultProp; } indexed = true; } else if (indexers.Length != 0) { // Unusable continue; } if (!_calltable.TryGetValue(name, out var invoker)) { invoker = new CascadingInvoker(_logger); _calltable.Add(name, invoker); } invoker.Add(controller, propInfo, indexed); } } }
/// <summary> /// Get cached invoker /// </summary> /// <param name="key"></param> /// <param name="invoker"></param> /// <returns></returns> private bool TryGetInvoker(string key, out CascadingInvoker invoker) { return(_calltable.TryGetValue(key.ToLowerInvariant(), out invoker) || _calltable.TryGetValue(kDefaultProp, out invoker)); }
/// <summary> /// Get cached invoker /// </summary> /// <param name="key"></param> /// <param name="invoker"></param> /// <returns></returns> private bool GetInvoker(string key, out CascadingInvoker invoker) => !_calltable.TryGetValue(key, out invoker) && !_calltable.TryGetValue(kDefaultProp, out invoker);
/// <summary> /// Add invoker found on controller /// </summary> /// <param name="invoker"></param> internal void Add(CascadingInvoker invoker) { _attachedTo.Add(invoker); }