コード例 #1
0
        private void ApplyResolver(object value, TypeProvider typeProvider)
        {
            if (typeProvider.Parent != null)
            {
                ApplyResolver(value, typeProvider.Parent);
            }

            var members = typeProvider.GetByAttribute <InjectAttribute>(true);

            if (members != null)
            {
                foreach (var member in members)
                {
                    var kind = member.Kind;
                    if ((kind & MemberKind.Field) == MemberKind.Field ||
                        (kind & MemberKind.Property) == MemberKind.Property)
                    {
                        var provider = GetResolver(member.ProviderType, true);
                        if (provider != null)
                        {
                            if (member.ProviderType != member.Type)
                            {
                                member.SetValue(value, CreateLazy(provider, member.Type, member.ProviderType));
                            }
                            else
                            {
                                member.SetValue(value, provider.Resolve(this, member.Type));
                            }
                        }
                    }
                }
            }
        }
コード例 #2
0
            public bool MoveNext()
            {
                bool result = false;

                if (_members != null)
                {
                    if (!_isAll)
                    {
                        while (_index >= 0 && _index < _members.Count && (_members[_index].Kind & _kind) != _members[_index].Kind)
                        {
                            _index++;
                        }
                    }
                    if (_index >= 0 && _index < _members.Count)
                    {
                        _current = _members[_index];
                        _index++;
                        result = true;
                    }
                    else
                    {
                        _current = null;
                    }
                }
                if (!result)
                {
                    if (_enumerable.AutoRelease)
                    {
                        TypeProvider.Push(_enumerable);
                    }
                }
                return(result);
            }
コード例 #3
0
 public virtual TypeProvider AddProvider(TypeProvider provider)
 {
     AddTypeProvider(provider);
     if (provider.Parsed)
     {
         AddToAttribute(provider);
     }
     return(provider);
 }
コード例 #4
0
        protected virtual TypeProvider CreateTypeProvider(Type type, MemberKind kind = MemberKind.All)
        {
            var provider = new TypeProvider(this, type);

            AddTypeProvider(provider);
            provider.Parse(kind);
            AddToAttribute(provider);
            return(provider);
        }
コード例 #5
0
 private void AddToAttribute(TypeProvider provider)
 {
     foreach (var attribute in provider.MembersAttributes)
     {
         HashSet <TypeProvider> hashSet;
         if (!_byAttribute.TryGetValue(attribute, out hashSet))
         {
             hashSet = new HashSet <TypeProvider>();
             _byAttribute.Add(attribute, hashSet);
         }
         hashSet.Add(provider);
     }
     foreach (var attribute in provider.TypeAttributes)
     {
         Type attributeType = attribute.GetType();
         HashSet <TypeProvider> hashSet;
         if (!_byAttribute.TryGetValue(attributeType, out hashSet))
         {
             hashSet = new HashSet <TypeProvider>();
             _byAttribute.Add(attributeType, hashSet);
         }
         hashSet.Add(provider);
     }
 }
コード例 #6
0
 public virtual void ParseProvider(TypeProvider provider, MemberKind kind = MemberKind.All)
 {
     AddTypeProvider(provider);
     provider.Parse(kind);
     AddToAttribute(provider);
 }
コード例 #7
0
 protected virtual void AddTypeProvider(TypeProvider provider)
 {
     _byType.Add(provider.Type, provider);
 }