예제 #1
0
        private DictionaryAdapterMeta InternalGetAdapterMeta(Type type,
                                                             PropertyDescriptor descriptor, DictionaryAdapterMeta other)
        {
            if (type == null)
            {
                throw new ArgumentNullException("type");
            }
            if (type.GetTypeInfo().IsInterface == false)
            {
                throw new ArgumentException("Only interfaces can be adapted to a dictionary", "type");
            }

            return(interfaceToMeta.GetOrAdd(type, t =>
            {
                if (descriptor == null && other != null)
                {
                    descriptor = other.CreateDescriptor();
                }

#if FEATURE_LEGACY_REFLECTION_API
                var appDomain = Thread.GetDomain();
                var typeBuilder = CreateTypeBuilder(type, appDomain);
#else
                var typeBuilder = CreateTypeBuilder(type);
#endif
                return CreateAdapterMeta(type, typeBuilder, descriptor);
            }));
        }
예제 #2
0
        private DictionaryAdapterMeta InternalGetAdapterMeta(
            Type type,
            PropertyDescriptor descriptor,
            DictionaryAdapterMeta other
            )
        {
            if (type == null)
            {
                throw new ArgumentNullException(nameof(type));
            }
            if (type.IsInterface == false)
            {
                throw new ArgumentException(
                          "Only interfaces can be adapted to a dictionary",
                          nameof(type)
                          );
            }

            return(interfaceToMeta.GetOrAdd(
                       type,
                       t =>
            {
                if (descriptor == null && other != null)
                {
                    descriptor = other.CreateDescriptor();
                }

                var typeBuilder = CreateTypeBuilder(type);
                return CreateAdapterMeta(type, typeBuilder, descriptor);
            }
                       ));
        }
예제 #3
0
        private DictionaryAdapterMeta InternalGetAdapterMeta(Type type,
                                                             PropertyDescriptor descriptor, DictionaryAdapterMeta other)
        {
            if (type == null)
            {
                throw new ArgumentNullException("type");
            }
            if (type.GetTypeInfo().IsInterface == false)
            {
                throw new ArgumentException("Only interfaces can be adapted to a dictionary", "type");
            }

            DictionaryAdapterMeta meta;

            using (interfaceToMetaLock.ForReading())
            {
                if (interfaceToMeta.TryGetValue(type, out meta))
                {
                    return(meta);
                }
            }

            using (var heldLock = interfaceToMetaLock.ForReadingUpgradeable())
            {
                if (interfaceToMeta.TryGetValue(type, out meta))
                {
                    return(meta);
                }

                using (heldLock.Upgrade())
                {
                    if (descriptor == null && other != null)
                    {
                        descriptor = other.CreateDescriptor();
                    }

#if FEATURE_LEGACY_REFLECTION_API
                    var appDomain   = Thread.GetDomain();
                    var typeBuilder = CreateTypeBuilder(type, appDomain);
#else
                    var typeBuilder = CreateTypeBuilder(type);
#endif
                    meta = CreateAdapterMeta(type, typeBuilder, descriptor);
                    interfaceToMeta.Add(type, meta);
                    return(meta);
                }
            }
        }