@@ -80,43 +80,40 @@ public bool UnmapEnum<TEnum>(string? pgName = null, INpgsqlNameTranslator? nameT
8080 #region Composite mapping
8181
8282 public INpgsqlTypeMapper MapComposite < T > ( string ? pgName = null , INpgsqlNameTranslator ? nameTranslator = null )
83- => MapComposite ( typeof ( T ) , pgName , nameTranslator ) ;
83+ => MapComposite ( pgName , nameTranslator , typeof ( T ) , t => new CompositeTypeHandlerFactory < T > ( t ) ) ;
8484
85- public bool UnmapComposite < T > ( string ? pgName = null , INpgsqlNameTranslator ? nameTranslator = null )
86- => UnmapComposite ( typeof ( T ) , pgName , nameTranslator ) ;
87-
88- public INpgsqlTypeMapper MapComposite ( Type compType , string ? pgName = null , INpgsqlNameTranslator ? nameTranslator = null ) {
89- if ( pgName != null && pgName . Trim ( ) == "" )
90- throw new ArgumentException ( "pgName can't be empty" , nameof ( pgName ) ) ;
85+ public INpgsqlTypeMapper MapComposite ( Type clrType , string ? pgName = null , INpgsqlNameTranslator ? nameTranslator = null )
86+ => MapComposite ( pgName , nameTranslator , clrType , t => ( NpgsqlTypeHandlerFactory )
87+ Activator . CreateInstance ( typeof ( CompositeTypeHandlerFactory < > ) . MakeGenericType ( clrType ) , t ) ! ) ;
9188
92- if ( nameTranslator == null )
93- nameTranslator = DefaultNameTranslator ;
94- if ( pgName == null )
95- pgName = GetPgName ( compType , nameTranslator ) ;
96-
97- var thfType = typeof ( CompositeTypeHandlerFactory < > ) ;
98- var thf = ( NpgsqlTypeHandlerFactory ) Activator . CreateInstance (
99- thfType . MakeGenericType ( compType ) ,
100- BindingFlags . Instance | BindingFlags . Public | BindingFlags . NonPublic ,
101- binder : null ,
102- args : new object [ ] { nameTranslator } ,
103- culture : null ) ! ;
104-
105- return AddMapping ( new NpgsqlTypeMappingBuilder {
106- PgTypeName = pgName ,
107- ClrTypes = new [ ] { compType } ,
108- TypeHandlerFactory = thf ,
109- } . Build ( ) ) ;
89+ INpgsqlTypeMapper MapComposite ( string ? pgName , INpgsqlNameTranslator ? nameTranslator , Type type , Func < INpgsqlNameTranslator , NpgsqlTypeHandlerFactory > factory )
90+ {
91+ if ( pgName != null && string . IsNullOrWhiteSpace ( pgName ) )
92+ throw new ArgumentException ( "pgName can't be empty." , nameof ( pgName ) ) ;
93+
94+ nameTranslator ??= DefaultNameTranslator ;
95+ pgName ??= GetPgName ( type , nameTranslator ) ;
96+
97+ return AddMapping (
98+ new NpgsqlTypeMappingBuilder
99+ {
100+ PgTypeName = pgName ,
101+ ClrTypes = new [ ] { type } ,
102+ TypeHandlerFactory = factory ( nameTranslator ) ,
103+ }
104+ . Build ( ) ) ;
110105 }
111106
112- public bool UnmapComposite ( Type compType , string ? pgName = null , INpgsqlNameTranslator ? nameTranslator = null ) {
113- if ( pgName != null && pgName . Trim ( ) == "" )
114- throw new ArgumentException ( "pgName can't be empty" , nameof ( pgName ) ) ;
107+ public bool UnmapComposite < T > ( string ? pgName = null , INpgsqlNameTranslator ? nameTranslator = null )
108+ => UnmapComposite ( typeof ( T ) , pgName , nameTranslator ) ;
115109
116- if ( nameTranslator == null )
117- nameTranslator = DefaultNameTranslator ;
118- if ( pgName == null )
119- pgName = GetPgName ( compType , nameTranslator ) ;
110+ public bool UnmapComposite ( Type clrType , string ? pgName = null , INpgsqlNameTranslator ? nameTranslator = null )
111+ {
112+ if ( pgName != null && string . IsNullOrWhiteSpace ( pgName ) )
113+ throw new ArgumentException ( "pgName can't be empty." , nameof ( pgName ) ) ;
114+
115+ nameTranslator ??= DefaultNameTranslator ;
116+ pgName ??= GetPgName ( clrType , nameTranslator ) ;
120117
121118 return RemoveMapping ( pgName ) ;
122119 }
@@ -127,9 +124,9 @@ public bool UnmapComposite(Type compType, string? pgName = null, INpgsqlNameTran
127124
128125 // TODO: why does ReSharper think `GetCustomAttribute<T>` is non-nullable?
129126 // ReSharper disable once ConstantConditionalAccessQualifier ConstantNullCoalescingCondition
130- static string GetPgName ( Type compType , INpgsqlNameTranslator nameTranslator )
131- => compType . GetCustomAttribute < PgNameAttribute > ( ) ? . PgName
132- ?? nameTranslator . TranslateTypeName ( compType . Name ) ;
127+ static string GetPgName ( Type clrType , INpgsqlNameTranslator nameTranslator )
128+ => clrType . GetCustomAttribute < PgNameAttribute > ( ) ? . PgName
129+ ?? nameTranslator . TranslateTypeName ( clrType . Name ) ;
133130
134131 #endregion Misc
135132 }
0 commit comments