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); })); }
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); } )); }
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); } } }