/// <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);
                }
            }
        }
Пример #2
0
 /// <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);
Пример #4
0
 /// <summary>
 /// Add invoker found on controller
 /// </summary>
 /// <param name="invoker"></param>
 internal void Add(CascadingInvoker invoker)
 {
     _attachedTo.Add(invoker);
 }