c# reflection asp.net-membership dapper

c# - Llama al constructor personalizado con Dapper?



reflection asp.net-membership (2)

Yo usaría la API de consulta no genérica aquí ...

return connection.Query(sql, args).Select(row => new AnyType((string)row.Foo, (int)row.Bar) { Other = (float)row.Other }).ToList();

Usando esto, puede usar constructores no predeterminados y asignaciones de propiedades, sin ningún cambio, usando "dinámico" como un paso intermedio.

Estoy tratando de usar Dapper para interactuar con las tablas de ASP.NET SQL Membership Provider. Envolví la clase SqlMembershipProvider y agregué un método adicional para que los usuarios de Membership reciban ciertos criterios relacionados con algunas tablas personalizadas que tengo.

Al consultar los datos con Dapper, parece que primero Dapper crea una instancia de la clase con un constructor sin parámetros, y luego "asigna" las columnas devueltas a las propiedades del objeto.

Sin embargo, la propiedad UserName en la clase MembershipUser no tiene un configurador. A juzgar por alrededor de la línea 1417 en Dapper SqlMapper.cs, el método GetSettableProps() solo obtiene propiedades configurables.

Intenté hacer una consulta MultiMap para invocar al constructor, pero el problema con eso es que los objetos pasados ​​en la consulta ya no tienen el nombre de usuario.

Supongo que podría modificar el método GetSettableProps() , pero no estoy seguro de si funcionará o si afectará mi código existente.

¿Hay alguna forma de invocar el constructor personalizado que tiene la clase MembershipUser?

¿O hay un cambio razonable que podría hacerle a Dapper para apoyar mi situación?

** ACTUALIZACIÓN **

La respuesta de Marc para usar el método no genérico / dinámico Query () fue correcta, pero para la posteridad, este es el método al que me refería dentro de Dapper:

static List<PropInfo> GetSettableProps(Type t) { return t .GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance) .Select(p => new PropInfo { Name = p.Name, Setter = p.DeclaringType == t ? p.GetSetMethod(true) : p.DeclaringType.GetProperty(p.Name).GetSetMethod(true), Type = p.PropertyType }) .Where(info => info.Setter != null) .ToList(); }


Yo uso esto tal vez es ayudar a alguien

YourList = connection.Query<YourQueryClass>(Query, arg) .Select(f => new ClassWithConstructor(f.foo,f.bar)) .ToList();